如何先创建一些测试弹簧豆

时间:2019-03-05 16:30:15

标签: java spring spring-boot

我有生产bean A,在@TestConfiguration bean B中。这些bean中没有一个相互依赖。但是在测试中,我希望在bean A之前实例化beanB。这是因为B为A准备了本地测试环境。我如何实现它?

我不能仅用@DependsOn注释A,因为B仅在某些测试中可用,并且我不想将生产代码与测试绑定。

3 个答案:

答案 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 {
...