gpt4 book ai didi

java - 您可以拥有多个 @SpringBootTest 类,每个类都有自己的内部 @TestConfiguration 定义相同的 bean 而不会发生冲突吗?

转载 作者:行者123 更新时间:2023-12-05 06:57:13 27 4
gpt4 key购买 nike

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

运行上述测试时断言失败,我看到以下输出:

从测试 A 创建字符串 bean

运行测试 B

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

最佳答案

我正在测试 Spring Cloud Function事实证明,我在 application.yml 中定义了一个组件扫描,该扫描导致两个内部 @TestConfiguration 类都被评估。因此,您需要对测试设置格外小心,否则可能会发生难以追踪的怪异行为。

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

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

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

关于java - 您可以拥有多个 @SpringBootTest 类,每个类都有自己的内部 @TestConfiguration 定义相同的 bean 而不会发生冲突吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64941444/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com