我有一个如下所示的项目,
时钟在配置文件中定义为
@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.
}
}
如何解决此代码?
答案 0 :(得分:0)
我以前经常在Spring上下文中提倡使用模拟,因为这意味着您可以简单地注入并替换您想要在测试中使用的行为。但是,我很快意识到这将比我想要的更多地是一个错误。嘲笑这些东西永远不能证明它可以正常工作/开始接线。
话虽如此,我建议您做三件事。
对于初学者来说,这就是我重新定义测试类的方式,您必须在特定时间使用特定的Clock
bean集。请注意以下几点:
Clock
bean是主要的,因此它将是此测试上下文中使用的 权威Clock
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());
}
}
}