我希望用 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 block 之外的大部分代码。
@Test
public void testToString() {
TestClass testClass = new TestClass();
String expected = "{\"testAttr\":null}";
assertEquals(expected, testClass.toString());
}
如何进行涵盖 catch block 的测试?
最佳答案
当然,您会尝试通过将封闭对象设置为某种奇怪的状态来以某种方式触发该异常。但实现完整代码覆盖率的更好方法是模拟映射器并使其抛出所需的异常。一般来说,您需要的步骤是:
- 将 ObjectMapper 的创建转移到新方法“getObjectMapper”。在运行时它将决定是否返回真实的或虚假的映射器。
- 在您的测试中注入(inject)一个假的 ObjectMapper 并使“getObjectMapper”返回假的映射器而不是新的映射器。
- 当调用 writeValueAsString 方法时,使其抛出 JsonProcessingException
- 运行测试
理论上你可以手动创建假的 ObjectMapper,例如通过创建它的子类但这不是推荐的方式。我建议使用模拟框架。模拟框架可以让您表达诸如“当调用方法 A 时抛出异常 B”之类的内容。
关于java - Junit 测试 - Jackson toString 中的 Eclemma 覆盖率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48279358/