带有 h2 的 Spring Boot 单元测试失败的模式

Posted

技术标签:

【中文标题】带有 h2 的 Spring Boot 单元测试失败的模式【英文标题】:Spring boot unit test with h2 failing for schema 【发布时间】:2021-06-14 05:37:49 【问题描述】:

我有如下插入语句的 sql 文件

插入 demo.course (col1, col2) VALUES('Val 1', 'KS1')

我的单元测试

@ExtendWith(SpringExtension.class)
@DataJpaTest
@AutoConfigureTestDatabase //h2
@ActiveProfiles("test")
class TopicRepositoryTest extends BaseRepositoryTest 

    @Test
    public void newTopicCreationShouldBePossible()         
        Topics newTopic = createTopics("STEAM"); //from base
        assertNotNull(newTopic.getId());
    

Application-test.props

spring.datasource.url=jdbc:h2:mem:testdb;IGNORECASE=TRUE;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;DATABASE_TO_UPPER=false

spring.jpa.properties.hibernate.default_schema=DEMO

spring.datasource.hikari.schema=DEMO

错误:

引起:org.springframework.beans.factory.BeanCreationException: 创建类中定义的名称为“entityManagerFactory”的bean时出错 路径资源 [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: bean初始化失败;嵌套异常是 org.springframework.jdbc.datasource.init.ScriptStatementFailedException: 执行类路径资源的 SQL 脚本语句 #1 失败 [maria/importcommon.sql]: 插入 demo.mytable (col1, col2) 值('VAL 1','KS1');嵌套异常是 org.h2.jdbc.JdbcSQLSyntaxErrorException:找不到模式“DEMO”; SQL 声明:

阅读一些帖子,我添加了以下内容,但它不起作用

spring.jpa.properties.hibernate.default_schema=DEMO

spring.datasource.hikari.schema=DEMO

如何解决此问题并通过测试?

【问题讨论】:

【参考方案1】:

如果不存在,您可以使用 spring.datasource.url 创建架构

spring.datasource.url=jdbc:h2:mem:testdb;INIT=CREATE SCHEMA IF NOT EXISTS DEMO;IGNORECASE=TRUE;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;DATABASE_TO_UPPER=false

【讨论】:

【参考方案2】:

我建议在没有架构前缀的情况下更新您的插入语句

插入课程 (col1, col2) VALUES('Val 1', 'KS1');

删除了“演示”。

【讨论】:

我看到一个错误 - Schema not found sql 语句。 app.property spring.jpa.properties.hibernate.default_schema=demo 干扰了 application-test.properties。那么有没有办法使该架构不存在? 如果我没有在测试配置文件属性 spring.jpa.properties.hibernate.default_schema= 中指定为空,则可以使用

以上是关于带有 h2 的 Spring Boot 单元测试失败的模式的主要内容,如果未能解决你的问题,请参考以下文章

使用 Liquibase 为 Spring Boot 应用程序中的单元测试初始化​​内存 H2

在spring boot中进行单元测试之前,通过data.sql文件向h2数据库中插入数据

Spring Boot中单元测试数据库的切换策略

使用 H2 数据库和 Liquibase 配置 Spring Boot

Spring Boot 2.x 实践记:H2 Database

Spring Boot 2.x 实践记:H2 Database