Junit 测试 - Jackson toString 中的 Eclemma 覆盖率

Junit test - Eclemma Coverage in Jackson toString

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

@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 块的测试?

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

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

理论上,您可以手动创建假的 ObjectMapper,例如通过创建它的子类,但这不是推荐的方法。我建议使用 模拟框架 。一个模拟框架可以让你表达像 "when method A is called then throw exception B".

这样的东西
  1. 您可以为 class 定义一些属性并声明字符串的 return。
  2. 您已经测试了空对象。
  3. 引发异常并查看它是否处理了它。 像: when(mapper.writeValueAsString(any(Object.class))).thenThrow(new JsonProcessingException("Error"){}); 也很有帮助