运行 来自 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 注释时,请尝试完全不带参数地使用它。并确保将测试放入正确的包装中,这很重要。这将打开您的应用程序的自动解析。

现在我将尝试简要解释为什么它很重要,这个话题真的很广泛和深刻。

  1. Spring 引导检查 class 是否用 @SpringBootConfiguration 注释(它是放在 @SpringBootApplication 上的注释 - 这反过来又在你的主 class) 与集成测试存在于同一个包中(比方说,com.abc.myapp.test 是你放置测试的地方)
  2. 如果没有找到,它会向上移动一个包裹并在那里检查 (com.abc.myapp)。它会一次又一次地这样做,直到根包然而,让我们假设 @SpringBootApplication 注释 class 在这个包中。注意,如果此递归 "search" 没有找到 @SpringBootApplication 注释 class - 测试不会开始。这就是为什么使用 spring 启动应用程序提供的包结构很重要。

  3. 现在,当它发现 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"。

完全不同的东西,没有递归搜索,没有自动配置启动等