我有生产bean A,在@TestConfiguration
bean B中。这些bean中没有一个相互依赖。但是在测试中,我希望在bean A之前实例化beanB。这是因为B为A准备了本地测试环境。我如何实现它?
我不能仅用@DependsOn
注释A,因为B仅在某些测试中可用,并且我不想将生产代码与测试绑定。
答案 0 :(得分:0)
但是在测试中,我希望在bean A之前实例化bean B
...
而且我不想将生产代码与测试绑定。
像这样吗?
@Profile("test")
@Bean
public BeanB beanB() {
return new BeanB();
}
@Profile("test")
@Bean
public BeanA beanA(BeanB beanB) {
return new BeanA();
}
@Profile("!test")
@Bean
public BeanA beanA() {
return new BeanA();
}
答案 1 :(得分:0)
没有简单的方法可以完成您要问的事情。最好的选择是在A中具有可选的依赖项。在生产中,该依赖项将丢失,因此将被忽略。在测试中,您将提供一个包含测试准备实现的bean。
是的,为了测试,您添加了一些额外的复杂性,这虽然不理想,但却非常有限。
原谅可怕的名字
interface APreparer {
void prepareA();
}
@Component
public class A {
public A(final Optional<APreparer> preparer) {
preparer.ifPresent(APreparer::prepareA);
}
}
答案 2 :(得分:0)
您可以创建一个TestApplication(在src/test/java
中),该应用程序简单地扩展了实际的Spring Boot应用程序类,并使该类依赖于您的测试bean。然后告诉SpringBootTest加载您的TestApplication而不是生产应用程序。
TestApplication示例:
@DependsOn("beanB")
@Configuration
@Import(YourApplication.class)
public class TestApplication {}
示例测试类:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestApplication.class)
public class YourApplicationTests {
...