为了说明这个问题,我有两个独立的@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将它们拉入各个测试中,但这并不能一致地解决这个问题。
1条答案
按热度按时间r1zk6ea11#
我在测试一个spring云函数,结果发现我在test/resources文件夹中的application.yml中定义了一个组件扫描,导致对两个内部@testconfiguration类进行评估。因此,您需要对测试设置格外小心,否则可能会发生难以跟踪的奇怪行为。
在这个示例中,我的类都在com.example.demo和application.yml下定义,如下所示
删除此不必要的扫描后,测试将按预期运行。