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

时间:2020-01-08 05:02:44

标签: java spring-boot apache-kafka integration-testing spring-boot-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没有启动我的原始应用程序的尝试。

1 个答案:

答案 0 :(得分:1)

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

  • Spring Boot测试设置
  • Kafka集成

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

快速解答: 当您放置@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尽力模仿真实应用程序的启动

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

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