为什么不能在自动装配的初始化spring bean的字段中设置mockito模拟?

时间:2015-12-06 07:58:36

标签: spring mockito

天真地我以为我可以将一个mockito设置为已经初始化的spring bean。当我在沿途的某个地方这样做时,豆子会回到原来注入的弹簧值。

除了注入模拟通过xml或java spring配置之外没有其他方法吗?

由于

1 个答案:

答案 0 :(得分:1)

我假设您正在讨论您运行的集成测试,例如与' @RunWith(SpringJUnit4ClassRunner.class)'。在单元测试中,您通常不会处理Spring - 这是Spring和DI的优势。

我通常使用以下内容覆盖测试配置的生产配置:

  • 要覆盖@Autowired / @Injected bean,请将测试配置中的bean标记为@Primary
  • 要按名称覆盖bean注入,请在测试配置中使用别名(请参阅下面的示例)

您的生产配置:

@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 {...}