如何为简单的配置类编写测试?

时间:2018-08-22 11:44:07

标签: java testing junit mockito

我代码中的每个类都必须经过至少60%的测试。我在理解如何测试简单的配置类(如下面的类)时遇到麻烦。谁能指出我正确的方向?

@Configuration
public class JsonConfiguration {

   @Bean
   @Primary
   public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
       ObjectMapper objectMapper = builder.build();
       objectMapper.registerModule(new JavaTimeModule());
       return objectMapper;
   }
}

2 个答案:

答案 0 :(得分:2)

这个问题解决了单元测试的一个基本问题:我们在做什么以及为什么。谷歌对此有很多话要说。

我坚信,大多数现有的单元测试用例只能进行自我测试,而且会消耗大量资源。

您的代码简洁明了,实际上没有任何可测试的内容,您应该尝试说服放宽60%规则的权力。感激不是90%。

如果您不能放宽60%的规则,则可以至少做三件事:

  1. 尝试留下深刻的印象。编写一个使用模拟对象的测试,该测试使用的代码行是代码的2-3倍,该对象断言您的代码执行了明显的工作。如果您曾经更改过代码的任何实现细节,但实际上并没有测试您的代码是否具有预期的效果,则必须更改它。

  2. 作弊。编写一个测试,声明什么都不会断言,而是以最简单的方式运行代码。将满足推纸器的需求并最小化维护。

  3. 尝试编写测试代码,以实际的方式测试您的代码是否可以在最抽象的级别上完成预期的工作。在您的情况下,可能是在运行代码后断言注入的objectmapper实际上包含模块。这比较困难,实际上主要是测试库代码,但至少它可以增加一些价值。

答案 1 :(得分:1)

这应该可以做到

@RunWith(MockitoJUnitRunner.class)
public class JsonConfigurationTest {

    @Mock
    Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder;

    @Mock
    ObjectMapper objectMapper;

    @Test
    public void testObjectMapper() {

        JsonConfiguration jsonConfiguration =  new JsonConfiguration();
        doAnswer(invocation -> objectMapper).when(jackson2ObjectMapperBuilder).build();
        ArgumentCaptor<Module> moduleArgumentCaptor = ArgumentCaptor.forClass(Module.class);

        doAnswer(invocation -> {
            Module value = moduleArgumentCaptor.getValue();
            assertTrue(value instanceof JavaTimeModule);
            return objectMapper;
        }).when(objectMapper).registerModule(moduleArgumentCaptor.capture());

        jsonConfiguration.objectMapper(jackson2ObjectMapperBuilder);
        verify(objectMapper, times(1)).registerModule(any(Module.class));
    }
}

使用ArgumentCaptor基本上可以断言正确的模块正在注册。然后使用verify确保一次调用了registerModule。