天真地我以为我可以将一个mockito设置为已经初始化的spring bean。当我在沿途的某个地方这样做时,豆子会回到原来注入的弹簧值。
除了注入模拟通过xml或java spring配置之外没有其他方法吗?
由于
答案 0 :(得分:1)
我假设您正在讨论您运行的集成测试,例如与' @RunWith(SpringJUnit4ClassRunner.class)'。在单元测试中,您通常不会处理Spring - 这是Spring和DI的优势。
我通常使用以下内容覆盖测试配置的生产配置:
您的生产配置:
@Configuration
class ProdConfig {
@Bean Abc abc() { return new AbcImpl(); }
@Bean Xyz xyz() { return new XyzImpl(); }
}
class SomeBean {
@Inject Abc abc;
@Resource(name="xyz") Xyz xys;
}
您的测试配置:
@Configuration
@Import(ProdConfig.class)
class TestConfig {
@Primary
@Bean(name={"abcOverride", "abc"})
Abc abc() {
return Mockito.mock(Abc.class);
}
@Primary
@Bean(name={"xyzOverride", "xyz"})
Xyz xyz() {
return Mockito.mock(Xyz.class);
}
}
然后在你的测试中:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
@TestPropertySource(properties = {"some.prop=true"}) //you can override properties as well
class MyTest {...}
还有一件事:您可能需要明确排除TestConfig类以避免干扰其他集成测试:
@Configuration
@ComponentScan(basePackages={"com.your.code"},
excludeFilters = {@ComponentScan.Filter(pattern = ".*TestConfig.*")})
class ProdConfig {...}