Java 您是否可以拥有多个@SpringBootTest类,每个类都有自己的内部@TestConfiguration来定义同一个bean而没有冲突?

Java 您是否可以拥有多个@SpringBootTest类,每个类都有自己的内部@TestConfiguration来定义同一个bean而没有冲突?,java,spring,spring-boot-test,Java,Spring,Spring Boot Test,为了说明这个问题,我有两个单独的@SpringBootTest类,每个类都有一个内部的@TestConfiguration静态类,这两个类都创建了相同的bean 当我运行TestB时,我看到TestA中的“stringBeans”bean正在被创建和使用,反之亦然。为什么会这样?我希望能够创建不同的测试来定义相同的bean,但该bean的配置不同。我怎样才能做到这一点 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.R

为了说明这个问题,我有两个单独的@SpringBootTest类,每个类都有一个内部的@TestConfiguration静态类,这两个类都创建了相同的bean

当我运行TestB时,我看到TestA中的“stringBeans”bean正在被创建和使用,反之亦然。为什么会这样?我希望能够创建不同的测试来定义相同的bean,但该bean的配置不同。我怎样才能做到这一点

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = "spring.main.allow-bean-definition-overriding=true")
public class TestA {

    @TestConfiguration
    static class TestConfig {
        @Bean
        @Primary
        public String stringBeans() {
            System.out.println("Creating string bean from Test A");
            return "Test A";
        }
    }

    @Test
    public void testA() {
        System.out.println("Running Test A");
    }
}
运行上述测试时,我看到以下输出:

从测试B创建字符串bean

运行测试A

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = "spring.main.allow-bean-definition-overriding=true")
public class TestB {

    @Autowired
    String stringBeans;

    @TestConfiguration
    static class TestConfig {
        @Bean
        @Primary
        public String stringBeans() {
            System.out.println("Creating string bean from Test B");
            return "Test B";
        }
    }

    @Test
    public void testB() {
        System.out.println("Running Test B");
        assertThat(stringBeans).isEqualTo("Test B");
    }
}
运行上述测试时,断言失败,我看到以下输出:

从测试创建字符串bean

运行测试B

我曾尝试创建用@TestConfiguration注释的单独类,并使用@Import将它们拉入每个相应的测试中,但这并不能一致地解决此问题。

我正在测试一个组件,结果发现我在test/resources文件夹中的application.yml中定义了一个组件扫描,这导致了两个内部错误@要评估的TestConfiguration类。因此,您需要对测试设置格外小心,否则可能会发生难以跟踪的奇怪行为

在本例中,我的类都在com.example.demo和application.yml下定义,如下所示

spring: 
     cloud:
       function:
         scan:
           packages: com.example.demo

删除此不必要的扫描后,测试将按预期运行。

请包含测试类的包。我无法在Spring Boot 2.4.0中重现此情况。你能为这两个测试添加你的Spring启动版本和所有导入吗?谢谢你看这个@rieckpil。事实证明,我在test/resources文件夹中的application.yml中配置了一个额外的组件扫描(请参阅下面的答案)。顺便说一句,您的测试Spring应用程序使用AWS和Testcontainers以及LocalStack博客文章非常棒!为我节省了大量的时间。谢谢,谢谢!很好,你可以自己解决这个问题+1