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

标签 java junit jackson code-coverage eclemma

我希望用 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 的测试?

最佳答案

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

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

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

关于java - Junit 测试 - Jackson toString 中的 Eclemma 覆盖率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48279358/

相关文章:

java - JAXB/Jackson XML 通用序列化

JavaFX:在一行中填充了一个条目后的上下文菜单?

java - 卡在 Bean Registration 上的 Tomcat webapp

java - 什么导致junit警告org.junit.platform.launcher.core.EngineDiscoveryOrchestrator lambda$logTestDescriptorExclusionReasons$7

android - 如何在自动化构建中启动 Android JUnit 测试?

安卓单元测试 : How to wait for Activity to update UI

xml - 您如何全局设置 Jackson 以忽略 Spring 中的未知属性?

java - jackson 注释根据另一个字段决定一个字段类

java - 如何使用java + hibernate将值插入SQL Server中的主键?

java - 运行简单的 Maven 项目后出现此错误