我有一个简单的Spring Boot应用程序,该应用程序从Kafka主题读取,并将消息保留在某些缓存中。 我想添加一个集成测试,该测试将启动我的原始应用程序,从嵌入式Kafka生成一些消息,然后声明缓存内容。
我正在努力“启动我的原始应用程序”部分。从Spring Boot集成测试中如何做到这一点? 我尝试做类似的事情:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = OriginalApplication.class)
@EmbeddedKafka
public class OriginalApplicationIntegrationTest {
@Test
public void test() throws Exception {
...
}
}
但是我发现Spring没有启动我的原始应用程序的尝试。
答案 0 :(得分:1)
首先,有两个可能出错的大“区域”:
我相信问题是关于第一部分的,所以我将专注于该部分。
快速解答:
当您放置@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尽力模仿真实应用程序的启动
如果将其与用于配置的参数一起使用,它的行为将完全不同:就像说:“我知道我的配置在哪里,不要尝试启动所有内容,这是我的配置,仅加载它”。
完全不同的东西,没有递归搜索,没有自动配置启动等。