修复JUnit-自动接线时钟

时间:2018-10-14 14:43:52

标签: junit dependency-injection autowired clock

我有一个如下所示的项目,

enter image description here

时钟在配置文件中定义为

@Qualifier("helperClock")
@Bean
public Clock helperClock() {
    return Clock.systemDefaultZone();
}

我需要为2个类编写JUnit:

1)测试助手类1 我的代码-不起作用

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest
    public class HelperClass1Test {
        @MockBean
        private Clock helperClock;
        @Autowired
        private HelperClass1 helperClass1;

        @Before
        public void init() {
            helperClock=Clock.fixed(Instant.parse("2017-12-03T10:15:30.00Z"),ZoneId.systemDefault());
        }   

        @Test
        public void testSomeHelperMethod1() {
            helperClass1.someHelperMethod1(); // I WANT mocked helperClock to be injected into HelperClass1 and used.
        }
    }

2)测试ImplClass-不起作用

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class HelperClass1Test {
    @MockBean
    private Clock helperClock;
    @Autowired
    private SomeServiceImpl someServiceImpl;

    @Before
    public void init() {
        helperClock=Clock.fixed(Instant.parse("2017-12-03T10:15:30.00Z"),ZoneId.systemDefault());
    }   

    @Test
    public void testSomeServiceMethod() {
        someServiceImpl.SomeServiceMethod(); // I WANT mocked helperClock to be injected into HelperClass1 and used.
    }
}

如何解决此代码?

1 个答案:

答案 0 :(得分:0)

我以前经常在Spring上下文中提倡使用模拟,因为这意味着您可以简单地注入并替换您想要在测试中使用的行为。但是,我很快意识到这将比我想要的更多地是一个错误。嘲笑这些东西永远不能证明它可以正常工作/开始接线。

话虽如此,我建议您做三件事。

  1. 指定要运行的测试配置文件。您可以根据需要使用“测试”。
  2. 创建位于您的测试配置文件下面的bean,然后使用它们注入。
  3. 避免使用模拟。这些模拟很诱人,并且很有用,但是如果您打算使用Spring的注入功能,则最好完全摆脱它们。

对于初学者来说,这就是我重新定义测试类的方式,您必须在特定时间使用特定的Clock bean集。请注意以下几点:

  • 我强制Clock bean是主要的,因此它将是此测试上下文中使用的 权威Clock bean。
  • 我强制配置文件进行“测试”,以便可以连接该配置文件下的bean。
  • 通过将类条目添加到SpringBootTest批注中,确保将这个bean添加到测试内部的上下文扫描中。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {
        YourSpringBootContextClassIfApplicable.class,
        HelperClass1Test.HelperClass1TestConfiguration.class
})
@ActiveProfiles("test")
public class HelperClass1Test {

    @Autowired
    private HelperClass1 helperClass1;

    @Test
    public void testSomeHelperMethod1() {
        helperClass1.someHelperMethod1();
    }

    @Configuration
    @Profile("test")
    static class HelperClass1TestConfiguration {

        @Bean
        @Primary
        public Clock helperClock() {
            return Clock.fixed(Instant.parse("2017-12-03T10:15:30.00Z"), ZoneId.systemDefault());
        }
    }
}