java—能否有多个@springboottest类,每个类都有自己的内部@testconfiguration,定义同一个bean而不发生冲突?

dffbzjpn  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(353)

为了说明这个问题,我有两个独立的@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");
    }
}

运行上述测试时,Assert失败,我看到以下输出:
从测试创建字符串bean
运行试验b
我尝试过创建用@testconfiguration注解的独立类,并使用@import将它们拉入各个测试中,但这并不能一致地解决这个问题。

r1zk6ea1

r1zk6ea11#

我在测试一个spring云函数,结果发现我在test/resources文件夹中的application.yml中定义了一个组件扫描,导致对两个内部@testconfiguration类进行评估。因此,您需要对测试设置格外小心,否则可能会发生难以跟踪的奇怪行为。
在这个示例中,我的类都在com.example.demo和application.yml下定义,如下所示

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

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

相关问题