news 2026/6/23 22:36:44

springboot集成h2内存数据库运行测试用例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
springboot集成h2内存数据库运行测试用例

springboot集成h2内存数据库运行测试用例

首先引入我们的依赖

引入h2的依赖和spring的依赖

dependencies{implementation'org.springframework.boot:spring-boot-h2console'implementation'org.springframework.boot:spring-boot-starter-data-jdbc'// 引入h2内存数据库runtimeOnly'com.h2database:h2'testImplementation'org.springframework.boot:spring-boot-starter-data-jdbc-test'testRuntimeOnly'org.junit.platform:junit-platform-launcher'testImplementationplatform('org.junit:junit-bom:5.13.4')testImplementation'org.junit.jupiter:junit-jupiter'}

完整的配置

build.gradle

plugins{id'java'id'groovy'id'org.springframework.boot'version'4.0.0'id'io.spring.dependency-management'version'1.1.7'}group='local'version='0.0.1-SNAPSHOT'description=''java{toolchain{languageVersion=JavaLanguageVersion.of(25)}}sourceSets{main{groovy{srcDirs=['src/main/groovy','src/main/java']}}test{groovy{srcDirs=['src/test/groovy','src/test/java']}}}repositories{mavenCentral()}dependencies{implementation'org.springframework.boot:spring-boot-h2console'implementation'org.springframework.boot:spring-boot-starter-data-jdbc'// jetty替换tomcatimplementation("org.springframework.boot:spring-boot-starter-jetty")implementation('org.springframework.boot:spring-boot-starter-webmvc')implementation'org.apache.groovy:groovy'// 引入h2内存数据库runtimeOnly'com.h2database:h2'testImplementation'org.springframework.boot:spring-boot-starter-data-jdbc-test'testImplementation'org.springframework.boot:spring-boot-starter-webmvc-test'testRuntimeOnly'org.junit.platform:junit-platform-launcher'testImplementationplatform('org.junit:junit-bom:5.13.4')testImplementation'org.junit.jupiter:junit-jupiter'}configurations{implementation{// 全局排除Tomcat依赖,确保使用Jettyexclude group:'org.springframework.boot',module:'spring-boot-starter-tomcat'}}tasks.withType(GroovyCompile).configureEach{// 启用groovy的增量编译,和注解处理器冲突!options.incremental=trueoptions.incrementalAfterFailure=true}tasks.withType(JavaCompile).configureEach{// 指定java版本options.release=25}tasks.named('jar'){// 设置重复文件处理策略duplicatesStrategy=DuplicatesStrategy.EXCLUDE}tasks.named('bootJar'){// 设置重复文件处理策略duplicatesStrategy=DuplicatesStrategy.EXCLUDE}tasks.named('test'){useJUnitPlatform()jvmArgs+='-XX:+EnableDynamicAgentLoading'jvmArgs+='-XX:+UseCompactObjectHeaders'// 测试输出配置testLogging{events"passed","skipped","failed","standardOut","standardError"// 显示System.out和System.err的输出showStandardStreams=trueshowCauses=trueshowExceptions=trueshowStackTraces=trueexceptionFormat='full'}// 在控制台实时显示输出outputs.upToDateWhen{false}}

settings.gradle

rootProject.name='my_sb4'enableFeaturePreview('GROOVY_COMPILATION_AVOIDANCE')

然后在spring的配置文件中配置数据库连接

注意要添加这些参数

  1. DB_CLOSE_DELAY=-1 : 避免没有连接时内存数据库关闭导致数据丢失
  2. MODE=MySQL : 使用mysql模式
  3. DATABASE_TO_LOWER=TRUE 和 CASE_INSENSITIVE_IDENTIFIERS=FALSE : 兼容mysql默认的忽略大小写模式
  4. LOCK_TIMEOUT=30 : 设置锁超时时间,避免一直死锁(单位秒)

内存数据库配置如下

application-test.yml

# application-test.ymlspring:datasource:# 内存数据库连接配置,注意参数url:jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;MODE=MySQL;DATABASE_TO_LOWER=TRUE;CASE_INSENSITIVE_IDENTIFIERS=FALSE;LOCK_TIMEOUT=30driver-class-name:org.h2.Driverusername:sapassword:""h2:console:# 开启h2控制台;通过 localhost:8080/h2-console 访问enabled:truepath:/h2-consolesql:init:# 初始化数据库方式,在运行测试用例时设置为alwaysmode:always# 初始化数据库脚本位置schema-locations:classpath:db/schema.sqldata-locations:classpath:db/data.sqlcontinue-on-error:false

通用配置如下

application.yml

spring:application:name:my_sb4server:port:8080servlet:context-path:/# 配置日志logging:level:org.springframework.boot:INFOorg.eclipse.jetty:WARNorg.springframework.jdbc:DEBUGpattern:console:"%d{yy-MM-dd HH:mm:ss.S} %highlight(%-5p) %c{1}:%L - %m%n"

然后创建我们的初始化脚本

schema.sql

CREATETABLEIFNOTEXISTST_USERS(IDBIGINTAUTO_INCREMENTPRIMARYKEY,USERNAMEVARCHAR(255)NULL);

data.sql

INSERTINTOT_USERS(USERNAME)VALUES('张三');INSERTINTOT_USERS(USERNAME)VALUES('李四');INSERTINTOT_USERS(USERNAME)VALUES('王五');

现在编写我们的测试用例

我们希望在测试用例中查询数据,就可以整样

packagelocal.my_sb4importorg.junit.jupiter.api.Testimportorg.springframework.beans.factory.annotation.Autowiredimportorg.springframework.boot.test.context.SpringBootTestimportorg.springframework.jdbc.core.JdbcTemplateimportorg.springframework.test.context.ActiveProfilesimporttools.jackson.databind.json.JsonMapper@SpringBootTest@ActiveProfiles("test")classMySb4ApplicationTest{@AutowiredprivateJdbcTemplate jdbcTemplate@AutowiredJsonMapper jsonMapper@TestvoidtestContextLoads(){println jsonMapper.writeValueAsString(jdbcTemplate.queryForList('''select * from t_Users '''))// 我们自己的表默认都在public下,通常不需要改变他们println jsonMapper.writeValueAsString(jdbcTemplate.queryForList('''select * from INFORMATION_SCHEMA.TABLES where table_schema!='information_schema' '''))}}

运行我们的用例将正常输出日志

25-12-16 17:26:30.4 DEBUG o.s.j.c.JdbcTemplate:470 - Executing SQL query [select * from t_Users ] 25-12-16 17:26:30.4 DEBUG o.s.j.d.DataSourceUtils:117 - Fetching JDBC Connection from DataSource [{"id":1,"username":"张三"},{"id":2,"username":"李四"},{"id":3,"username":"王五"}] 25-12-16 17:26:30.5 DEBUG o.s.j.c.JdbcTemplate:470 - Executing SQL query [select * from INFORMATION_SCHEMA.TABLES where table_schema!='information_schema' ] 25-12-16 17:26:30.5 DEBUG o.s.j.d.DataSourceUtils:117 - Fetching JDBC Connection from DataSource [{"table_catalog":"testdb","table_schema":"public","table_name":"t_users","table_type":"BASE TABLE","is_insertable_into":"YES","commit_action":null,"storage_type":"MEMORY","remarks":null,"last_modification":30,"table_class":"org.h2.mvstore.db.MVTable","row_count_estimate":3}]
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 16:21:57

商家福音!用PHP对接快递鸟接口,一键搞定单号所属快递识别

日常处理快递单时,C端用户查物流直接搜单号就行,但商家场景完全不同——每天面对成百上千个混杂着顺丰、中通、韵达等不同快递的单号,先搞清楚每个单号属于哪家快递,才能顺利发起物流追踪,这个环节要是靠人工比对&…

作者头像 李华
网站建设 2026/6/23 16:20:51

YT29B凿岩机吕梁精准检测稳定性能解析

近年来,国内凿岩设备市场呈现出明显的区域分化特征。以吕梁为代表的山西资源型城市,因矿山开采、隧道掘进及基础设施建设需求持续释放,对风动凿岩机、气腿式凿岩机等主力机型的采购活跃度居高不下。据2025年第三季度行业监测数据显示&#xf…

作者头像 李华
网站建设 2026/6/23 17:22:03

26、网络连接与安全全解析

网络连接与安全全解析 在当今数字化时代,网络连接和网络安全是我们日常使用计算机时不可忽视的重要方面。下面我们将详细探讨网络连接相关文件、网络安全的多个要点,包括密码安全、远程登录以及防火墙配置等内容。 网络连接相关文件问答 首先,我们来看一些关于连接互联网…

作者头像 李华
网站建设 2026/6/23 12:56:21

2025.12.16 HSRP双机热备

1)拓扑图2)实验步骤2.1 PC机配置PC0 PC1PC22.2 路由器配置2.3 交换机配置SW3 SW1SW22.4 测试PC0 ping PC1PC0 ping PC2

作者头像 李华
网站建设 2026/6/23 7:14:26

万全智能RFID模块设备他们产品档次怎么样

万全智能的RFID模块设备在行业内属于中高端档次,其产品特点主要体现在以下方面: 技术性能 读写能力 支持多协议兼容(如EPC Class1 Gen2、ISO 18000-6C等),读写距离可达10米以上(超高频型号)&…

作者头像 李华
网站建设 2026/6/23 18:09:35

RuoYi v1.2.0 全端开发神器:让多端适配从未如此简单!

一、 引言:为什么选择 RuoYi APP 框架?在移动应用开发领域,跨平台适配一直是开发者的噩梦。传统方案需为 iOS、Android、小程序等多端单独开发,成本高、效率低。而 RuoYi v1.2.0 基于 UniAppUniUI 的轻量级框架,彻底打…

作者头像 李华