news 2026/4/17 9:10:20

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/4/17 7:41:21

openFuyao多样化算力使能

一、引言:算力多样化时代的挑战与机遇1.1 当前算力发展趋势在数字经济快速发展的时代,算力已成为新型生产力的核心驱动力。当前算力发展呈现出显著的多样化特征: *异构硬件普遍化*:CPU、GPU、NPU、FPGA等多种处理器架构并存&#…

作者头像 李华
网站建设 2026/4/15 16:01:21

3.1IT治理

1、IT治理的驱动因素:解决信息孤岛 2、IT治理主要目标包括:与业务目标一致、有效利用信息与数据资源、风险管理。 3、管理层次分为三层:最高管理层、执行管理层、业务与服务执行层。 4、IT治理体系的具体构成包括:IT定位、IT治理架…

作者头像 李华
网站建设 2026/4/16 15:48:00

中小企业的营销“暖心伙伴”——北京易美之尚,让增长不再难

“深夜改完的营销方案,投出去却石沉大海;花大价钱引的流量,转头就成了‘一次性过客’”——这大概是很多中小企业主的日常焦虑。在互联网营销的浪潮里,不是不想冲,而是怕方向错;不是没投入,而是…

作者头像 李华
网站建设 2026/4/10 21:45:46

Excalidraw链接功能全解析:超链接与跳转处理

Excalidraw链接功能全解析:超链接与跳转处理 在远程协作日益频繁的今天,一张图是否“能点”,往往决定了它是装饰还是生产力工具。许多团队还在用静态截图传递信息时,另一些人已经通过 Excalidraw 构建起可交互的知识网络——点击一…

作者头像 李华
网站建设 2026/4/16 17:31:02

LobeChat能否实现AI香道师?气味搭配与情绪调节芳香疗法推荐

LobeChat能否实现AI香道师?气味搭配与情绪调节芳香疗法推荐 在快节奏的都市生活中,越来越多的人开始寻求非药物方式来缓解压力、调节情绪。冥想、音乐疗愈、自然接触……而其中,“香气”作为一种古老却始终鲜活的感官媒介,正悄然回…

作者头像 李华