Junit测试 - Jackson toString的Eclemma Coverage

时间:2018-01-16 10:42:35

标签: java junit jackson code-coverage eclemma

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

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

2 个答案:

答案 0 :(得分:0)

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

  1. 将ObjectMapper的创建转移到新方法'getObjectMapper'。在运行时,它将决定它是否返回真实或伪造的映射器。
  2. 在你的测试中注入一个假的ObjectMapper并使'getObjectMapper'返回假映射器而不是新的映射器。
  3. 当调用writeValueAsString方法时,make会抛出JsonProcessingException
  4. 运行测试
  5. 理论上你可以手动创建假的ObjectMapper,例如通过创建它的子类,但这不是推荐的方式。我建议使用模拟框架。模拟框架允许您表达“当调用方法A然后抛出异常B”之类的内容。

答案 1 :(得分:0)

  1. 您可以为您的类定义一些属性并断言字符串的返回。
  2. 您已经测试过null对象。
  3. 提出异常并查看它是否处理它。 喜欢: when(mapper.writeValueAsString(any(Object.class))).thenThrow(new JsonProcessingException("Error"){}); 并且也很有帮助link