如何在使用 DataJpaTest 的 Spring Boot 2.0 测试中访问 H2 控制台

Posted

技术标签:

【中文标题】如何在使用 DataJpaTest 的 Spring Boot 2.0 测试中访问 H2 控制台【英文标题】:How to access H2 console in Spring Boot 2.0 test that uses DataJpaTest 【发布时间】:2018-10-26 22:47:49 【问题描述】:

使用@DataJpaTest 时,如何配置测试类以使用处理 H2 控制台的 http 请求所需的位运行?

我正在运行使用 H2 的 Spring Boot 2.0 测试。我想在测试中设置断点并查看 H2 中表的内容。但是,当测试在断点处停止并且我将浏览器指向http://localhost:8080/h2-console 时,结果是一个空白页面,其中包含文本“localhost 没有发送任何数据”。因此,似乎测试正在运行而没有处理 H2 控制台的 http 请求所需的位,或者我使用的 URL 是错误的。

注意:当我运行测试时,控制台显示嵌入式 H2 数据库已成功启动,因此我确信 H2 确实在运行。

这是我的测试类注释:

@ExtendWith(SpringExtension.class)

@DataJpaTest

@TestInstance(TestInstance.Lifecycle.PER_CLASS)

我读到一篇文章建议在我的 pom 中包含 devtools,但这并没有解决我的问题。

编辑: 我的问题的症结似乎是我无法弄清楚如何配置测试以同时包含嵌入式测试数据库和正在运行的 servlet。如果我同时使用@DataJpaTest@SpringBootTest(webEnvironment = ...) 注释测试类,则测试会由于缺少 ServletWebServerFactory bean 而崩溃。删除 @DataJpaTest 修复了缺少 bean 的问题,但我不再有嵌入式测试数据库。仅使用 @DataJpaTest 无法启动 servlet

【问题讨论】:

【参考方案1】:

H2 控制台是一个仅在某些条件下启动的 Web 应用程序:

您正在开发一个基于 servlet 的 Web 应用程序。 com.h2database:h2 在类路径中。 您正在使用 Spring Boot 的开发人员工具。

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html#boot-features-sql-h2-console

如果您正在运行测试并且没有启动 ServletContext,那么 h2 控制台也不会启动。

【讨论】:

我找不到配置测试以使用测试 H2 数据库并包含正在运行的 servlet 的方法。如果我同时使用@DataJpaTest@SpringBootTest(webEnvironment = ...) 注释测试类,则测试会由于缺少ServletWebServerFactory bean 而崩溃。删除 @DataJpaTest 修复了缺少 bean 的问题,但我不再有嵌入式测试数据库。仅使用 @DataJpaTest 无法启动 servlet。

以上是关于如何在使用 DataJpaTest 的 Spring Boot 2.0 测试中访问 H2 控制台的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SpringBootTest 中的 @DataJpaTest 中导入配置类?

在 JUnit 5 中使用 @TestContainers 实现 @DataJpaTest

Spring @DataJpaTest 与 JUnit 5

在@DataJpaTest 中启用@Converter

使用 @DataJpaTest 进行集成测试

如果 Spring 安全性在类路径上,则无法使用 @DataJpaTest