繁体   English   中英

从 Spring Boot 集成测试运行原始应用程序

[英]Running the original application from Spring Boot integration test

我有一个简单的 Spring Boot 应用程序,它从 Kafka 主题读取并将消息保存到某个缓存中。 我想添加一个集成测试,它将启动我的原始应用程序,从嵌入式 Kafka 生成一些消息,然后断言缓存内容。

我正在努力解决“启动我的原始应用程序”部分。 如何从 Spring Boot 集成测试中做到这一点? 我试过做这样的事情:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = OriginalApplication.class)
@EmbeddedKafka
public class OriginalApplicationIntegrationTest {

    @Test
    public void test() throws Exception {
    ...
    }
}

但是我没有看到 Spring 尝试启动我的原始应用程序。

首先,有两个可能会出错的大“区域”:

  • Spring Boot 测试设置
  • 卡夫卡集成

我相信问题与第一部分有关,所以我将专注于该部分。

快速回答:当您放置@SpringBootTest注释时,请尝试完全不带参数地使用它。 并确保将测试放入正确的包中,这很重要。 这将打开应用程序的自动解析。

现在我将尝试简要解释为什么它很重要,该主题非常广泛而深入。

  1. Spring Boot 检查用@SpringBootConfiguration注释的类(它是放在@SpringBootApplication上的注释——它又在你的主类上)是否与集成测试存在于同一个包中(比如说, com.abc.myapp.test是你在哪里进行测试)
  2. 如果没有找到,它会打包一个并在那里检查( com.abc.myapp )。 它会一次又一次地这样做,直到根包,但是,让我们假设@SpringBootApplication注释类在这个包中。 请注意,如果此递归“搜索”未找到@SpringBootApplication注释类 - 测试不会开始。 这就是为什么使用 spring boot 应用程序提供的包结构很重要。

  3. 现在,当它找到那个类时,它知道应该扫描哪些包以获取 bean 以启动 Spring Boot 应用程序。 所以它尝试根据spring boot的做法(包com.abc.myapp及以下)寻​​找bean。 这次它再次从上到下递归地进行。

它还在此模式下运行您的启动器(自动配置)。

所以,底线:

指定不带参数的@SpringBootTest使得spring boot 尽量模拟真实应用的启动

但是,如果您将它与参数一起用于配置,则它的行为完全不同:就像说:“我知道我的配置在哪里,不要尝试启动所有内容,这是我的配置,仅加载它”。

完全不同的事情,没有递归搜索,没有自动配置启动等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM