【问题标题】:Junit test - Eclemma Coverage in Jackson toStringJunit 测试 - Jackson toString 中的 Eclemma 覆盖率
【发布时间】:2018-01-16 10:42:34
【问题描述】:

我希望用 Jackson JSON 覆盖方法 toString 的 100% 覆盖率。

@Override
public String toString() {
    ObjectMapper mapper = new ObjectMapper();
    try {
        return mapper.writeValueAsString(this);
    } catch (JsonProcessingException e) {
        logger.error(e.getMessage());
        return "";
    }
}

我可以做一个可以覆盖除 catch 块之外的大部分代码的测试。

@Test
public void testToString() {
        TestClass testClass = new TestClass();
        String expected = "{\"testAttr\":null}";
        assertEquals(expected, testClass.toString());
}

如何进行涵盖 catch 块的测试?

【问题讨论】:

    标签: java junit jackson code-coverage eclemma


    【解决方案1】:

    当然,您会尝试通过将封闭对象设置为某种奇怪的状态来以某种方式触发该异常。但实现完整代码覆盖的更好方法是模拟映射器并使其抛出所需的异常。通常您需要的步骤是:

    1. 将 ObjectMapper 的创建转移到新方法“getObjectMapper”。在运行时,它将决定它是返回一个真实的映射器还是一个假的映射器。
    2. 在您的测试中注入一个假的 ObjectMapper 并让“getObjectMapper”返回假的映射器而不是新的映射器。
    3. 当调用 writeValueAsString 方法时,使其抛出 JsonProcessingException
    4. 运行测试

    理论上,您可以手动创建伪造的 ObjectMapper,例如通过创建它的子类,但这不是推荐的方式。我建议使用模拟框架。模拟框架可以让您表达诸如“调用方法 A 时抛出异常 B”之类的内容。

    【讨论】:

    • 将映射器转移到一个方法,并使其使用 mockito 抛出异常。谢谢!
    【解决方案2】:
    1. 您可以为您的类定义一些属性并断言字符串的返回。
    2. 您已经测试了空对象。
    3. 引发异常并查看它是否处理它。 像: when(mapper.writeValueAsString(any(Object.class))).thenThrow(new JsonProcessingException("Error"){}); 也很有帮助link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      相关资源
      最近更新 更多