Spring Boot 2.0中如何在@DataJpaTest测试里访问H2控制台
解决@DataJpaTest测试时无法访问H2控制台的问题
我完全懂你的痛点——想用切片测试专注于JPA逻辑,又想在断点时通过H2控制台直观查看数据,但偏偏Web容器和嵌入式数据库的配置总是打架。下面给你两个可行的方案,帮你搞定这个问题:
方案一:用@SpringBootTest替代@DataJpaTest(推荐)
@DataJpaTest本质是JPA切片测试,默认只会加载和数据库操作相关的Bean,不会启动Servlet Web服务器,所以H2控制台的Web端点根本没法访问。我们可以用@SpringBootTest启动完整Web环境,再通过注解模拟@DataJpaTest的嵌入式数据库隔离特性:
修改测试类注解
把原来的@DataJpaTest替换成以下组合:
@ExtendWith(SpringExtension.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @TestInstance(TestInstance.Lifecycle.PER_CLASS) @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY) public class YourJpaTestClass { // 你的测试代码逻辑 }
@SpringBootTest(webEnvironment = ...):强制启动Servlet Web服务器,让H2控制台能被访问@AutoConfigureTestDatabase(replace = ANY):强制使用嵌入式H2数据库,和@DataJpaTest的默认行为完全一致,不会影响生产环境的数据库配置
配置H2控制台参数
确保application.properties(或application.yml)里有这些配置:
# 开启H2控制台 spring.h2.console.enabled=true spring.h2.console.path=/h2-console # 嵌入式H2数据库连接配置 spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1 spring.datasource.driver-class-name=org.h2.Driver spring.datasource.username=sa spring.datasource.password=
断点时访问H2控制台
当测试运行到断点时:
- 看测试日志找类似
Tomcat started on port(s): 12345 (http)的输出,拿到随机端口 - 在浏览器打开
http://localhost:12345/h2-console - 输入配置里的数据库URL(
jdbc:h2:mem:testdb)、用户名sa、空密码,点击Connect就能查看表数据了
方案二:给@DataJpaTest强制加Web容器(不推荐)
如果你非要用@DataJpaTest的切片特性,可以自定义配置类手动注入Web服务器工厂:
@ExtendWith(SpringExtension.class) @DataJpaTest @TestInstance(TestInstance.Lifecycle.PER_CLASS) @Import(WebServerConfig.class) public class YourJpaTestClass { // 你的测试代码 } @Configuration public class WebServerConfig { @Bean public ServletWebServerFactory servletWebServerFactory() { return new TomcatServletWebServerFactory(); } }
不过这种方式会额外加载Web相关Bean,不如方案一干净,只推荐在特殊场景下使用。
内容的提问来源于stack exchange,提问作者Mark Norman
相关产品推荐
相关产品推荐

