【发布时间】:2019-09-21 08:32:37
【问题描述】:
我知道在 @Configuration 中将 @Bean 带注释的方法调用为 already discussed。
但是我不明白为什么当bean被覆盖时它不起作用。
我有一个无法修改的遗留类。它同时是一个配置和一个业务 bean。这是一个简化版:
@Configuration
public class MyBean {
String someMethod() {
return otherBean() + "|" + otherBean();
}
int called = 0;
@Bean
Object otherBean() {
return called ++;
}
}
在someMethod() 内部,工厂方法otherBean() 被调用了两次,就@Bean 注释而言,实例应该从Spring 上下文中获取,因此实际代码return called ++; 应该只被调用一次。 someMethod() 的预期输出应始终为 0|0,并且在生产中确实如此。
当我要在单元测试中重新定义 bean 时,麻烦来了:
@SpringJUnitConfig//(MyBean.class)
public class BeanTest {
@Autowired
MyBean myBean;
@Test
void testIt() {
assertEquals("0|0", myBean.someMethod());
}
@Configuration
static class TestConfig {
@Bean
MyBean myBean() {
return new MyBean();
}
}
}
原因可能是测试中MyBean实例的一些额外设置(不包括在上面的sn-p中)。
现在,调用 myBean.someMethod() 返回 0|1 而不是 0|0。
当TestConfig 配置被删除并且测试上下文的配置被设置为@SpringJUnitConfig(MyBean.class) 时,一切都恢复正常(结果为0|0)。
在测试中注册bean有什么不同?
【问题讨论】: