[英]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 尝试启动我的原始应用程序。
首先,有两个可能会出错的大“区域”:
我相信问题与第一部分有关,所以我将专注于该部分。
快速回答:当您放置@SpringBootTest
注释时,请尝试完全不带参数地使用它。 并确保将测试放入正确的包中,这很重要。 这将打开应用程序的自动解析。
现在我将尝试简要解释为什么它很重要,该主题非常广泛而深入。
@SpringBootConfiguration
注释的类(它是放在@SpringBootApplication
上的注释——它又在你的主类上)是否与集成测试存在于同一个包中(比如说, com.abc.myapp.test
是你在哪里进行测试) 如果没有找到,它会打包一个并在那里检查( com.abc.myapp
)。 它会一次又一次地这样做,直到根包,但是,让我们假设@SpringBootApplication
注释类在这个包中。 请注意,如果此递归“搜索”未找到@SpringBootApplication
注释类 - 测试不会开始。 这就是为什么使用 spring boot 应用程序提供的包结构很重要。
现在,当它找到那个类时,它知道应该扫描哪些包以获取 bean 以启动 Spring Boot 应用程序。 所以它尝试根据spring boot的做法(包com.abc.myapp
及以下)寻找bean。 这次它再次从上到下递归地进行。
它还在此模式下运行您的启动器(自动配置)。
所以,底线:
指定不带参数的@SpringBootTest
使得spring boot 尽量模拟真实应用的启动
但是,如果您将它与参数一起用于配置,则它的行为完全不同:就像说:“我知道我的配置在哪里,不要尝试启动所有内容,这是我的配置,仅加载它”。
完全不同的事情,没有递归搜索,没有自动配置启动等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.