运行 来自 Spring 引导集成测试的原始应用程序
Running the original application from Spring Boot integration test
我有一个简单的 Spring 引导应用程序,它从 Kafka 主题读取并将消息保存到某个缓存。
我想添加一个集成测试,它将启动我的原始应用程序,从嵌入式 Kafka 生成一些消息,然后断言缓存内容。
我正在努力处理 "launch my original application" 部分。 Spring 引导集成测试如何做到这一点?
我试过这样做:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = OriginalApplication.class)
@EmbeddedKafka
public class OriginalApplicationIntegrationTest {
@Test
public void test() throws Exception {
...
}
}
但我没有看到 Spring 尝试启动我的原始应用程序。
首先,有两个可能会出错的大"areas":
- Spring 启动测试设置
- Kafka 集成
我认为问题出在第一部分,所以我将专注于该部分。
快速回答:
当您放置 @SpringBootTest
注释时,请尝试完全不带参数地使用它。并确保将测试放入正确的包装中,这很重要。这将打开您的应用程序的自动解析。
现在我将尝试简要解释为什么它很重要,这个话题真的很广泛和深刻。
- Spring 引导检查 class 是否用
@SpringBootConfiguration
注释(它是放在 @SpringBootApplication
上的注释 - 这反过来又在你的主 class) 与集成测试存在于同一个包中(比方说,com.abc.myapp.test
是你放置测试的地方)
如果没有找到,它会向上移动一个包裹并在那里检查 (com.abc.myapp
)。它会一次又一次地这样做,直到根包然而,让我们假设 @SpringBootApplication
注释 class 在这个包中。注意,如果此递归 "search" 没有找到 @SpringBootApplication
注释 class - 测试不会开始。这就是为什么使用 spring 启动应用程序提供的包结构很重要。
现在,当它发现 class 时,它知道应该扫描哪些包以查找 bean 以启动 spring 引导应用程序。因此它会尝试根据 spring 引导(包 com.abc.myapp
及以下)的做法来查找 bean。这次它再次从上到下递归地执行此操作。
它还会在此模式下运行您的启动程序(自动配置)。
所以,底线:
指定 @SpringBootTest
不带参数使得spring引导尽最大努力模仿真实应用程序的启动
但是,如果您将它与配置参数一起使用,它的行为将完全不同:就像在说:"I know where my configurations are, don't try to start everything, here is my configuration, load only it"。
完全不同的东西,没有递归搜索,没有自动配置启动等
我有一个简单的 Spring 引导应用程序,它从 Kafka 主题读取并将消息保存到某个缓存。 我想添加一个集成测试,它将启动我的原始应用程序,从嵌入式 Kafka 生成一些消息,然后断言缓存内容。
我正在努力处理 "launch my original application" 部分。 Spring 引导集成测试如何做到这一点? 我试过这样做:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = OriginalApplication.class)
@EmbeddedKafka
public class OriginalApplicationIntegrationTest {
@Test
public void test() throws Exception {
...
}
}
但我没有看到 Spring 尝试启动我的原始应用程序。
首先,有两个可能会出错的大"areas":
- Spring 启动测试设置
- Kafka 集成
我认为问题出在第一部分,所以我将专注于该部分。
快速回答:
当您放置 @SpringBootTest
注释时,请尝试完全不带参数地使用它。并确保将测试放入正确的包装中,这很重要。这将打开您的应用程序的自动解析。
现在我将尝试简要解释为什么它很重要,这个话题真的很广泛和深刻。
- Spring 引导检查 class 是否用
@SpringBootConfiguration
注释(它是放在@SpringBootApplication
上的注释 - 这反过来又在你的主 class) 与集成测试存在于同一个包中(比方说,com.abc.myapp.test
是你放置测试的地方) 如果没有找到,它会向上移动一个包裹并在那里检查 (
com.abc.myapp
)。它会一次又一次地这样做,直到根包然而,让我们假设@SpringBootApplication
注释 class 在这个包中。注意,如果此递归 "search" 没有找到@SpringBootApplication
注释 class - 测试不会开始。这就是为什么使用 spring 启动应用程序提供的包结构很重要。现在,当它发现 class 时,它知道应该扫描哪些包以查找 bean 以启动 spring 引导应用程序。因此它会尝试根据 spring 引导(包
com.abc.myapp
及以下)的做法来查找 bean。这次它再次从上到下递归地执行此操作。
它还会在此模式下运行您的启动程序(自动配置)。
所以,底线:
指定 @SpringBootTest
不带参数使得spring引导尽最大努力模仿真实应用程序的启动
但是,如果您将它与配置参数一起使用,它的行为将完全不同:就像在说:"I know where my configurations are, don't try to start everything, here is my configuration, load only it"。
完全不同的东西,没有递归搜索,没有自动配置启动等