我有一个使用PostgreSQL和Flyway的Spring Boot项目.我想测试用户仓库,因此添加了H2数据库.以下是用于测试的application.properties文件:

spring.datasource.url=jdbc:h2://mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa

spring.datasource.driver-class-name=org.h2.Driver

spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.format_sql=true

这是用户仓库代码:

@Repository
public interface UserRepository extends JpaRepository<UserEntity, Long> {

    Optional<UserEntity> findByEmail(String email);

    Optional<UserEntity> findByUsername(String username);
}

我为此创建了这样的测试:

@DataJpaTest
class UserRepositoryTest {

    @Autowired
    private UserRepository underTest;

    @Test
    void itShouldCheckThatUserExistsByEmail() {
        // given
        String email = "menotbob@gmail.com";
        UserEntity user = new UserEntity(
                email,
                "12345678",
                "BobIsMe"
        );
        underTest.save(user);

        // when
        boolean expected = underTest.findByEmail(email).isPresent();

        // then
        assertTrue(expected);
    }

当我开始测试时,它失败并出现以下错误:

SQL State  : 42001
Error Code : 42001
Message    : Syntax error in expression SQL "CREATE TABLE IF NOT EXISTS customer\000d\000a(\000d\000a    id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (INCREMENT 1 [*]START 1),\000d\000a    email VARCHAR(50) NOT NULL,\000d\000a    password VARCHAR(20) NOT NULL,\000d\000a    username VARCHAR(30) NOT NULL\000d\000a)"; ожидалось "[, ., ::, AT, FORMAT, *, /, %, +, -, ||, NOT, IS, ILIKE, REGEXP, AND, OR, START WITH, RESTART, INCREMENT, MINVALUE, MAXVALUE, CYCLE, NO, EXHAUSTED, CACHE, )"
Syntax error in SQL statement "CREATE TABLE IF NOT EXISTS customer\000d\000a(\000d\000a    id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (INCREMENT 1 [*]START 1),\000d\000a    email VARCHAR(50) NOT NULL,\000d\000a    password VARCHAR(20) NOT NULL,\000d\000a    username VARCHAR(30) NOT NULL\000d\000a)"; expected "[, ., ::, AT, FORMAT, *, /, %, +, -, ||, NOT, IS, ILIKE, REGEXP, AND, OR, START WITH, RESTART, INCREMENT, MINVALUE, MAXVALUE, CYCLE, NO, EXHAUSTED, CACHE, )"; SQL statement:
CREATE TABLE IF NOT EXISTS customer
(
    id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (INCREMENT 1 START 1),
    email VARCHAR(50) NOT NULL,
    password VARCHAR(20) NOT NULL,
    username VARCHAR(30) NOT NULL
) [42001-224]
Location   : db/migration/V00001__Create_tables.sql (D:\university\SkyCast\skycast-repo\skycast_spring\target\classes\db\migration\V00001__Create_tables.sql)
Line       : 1
Statement  : CREATE TABLE IF NOT EXISTS customer
(
    id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (INCREMENT 1 START 1),
    email VARCHAR(50) NOT NULL,
    password VARCHAR(20) NOT NULL,
    username VARCHAR(30) NOT NULL
)

以下是在我的PostgreSQL数据库中创建表的SQL脚本:

CREATE TABLE IF NOT EXISTS customer
(
    id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (INCREMENT 1 START 1),
    email VARCHAR(50) NOT NULL,
    password VARCHAR(20) NOT NULL,
    username VARCHAR(30) NOT NULL
);

CREATE TABLE IF NOT EXISTS customerCity
(
    customerId BIGINT NOT NULL,
    cityId BIGINT NOT NULL
);

CREATE TABLE IF NOT EXISTS customerHistory
(
    customerId BIGINT NOT NULL,
    requestId BIGINT NOT NULL
);

CREATE TABLE IF NOT EXISTS city
(
    id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (INCREMENT 1 START 1),
    name VARCHAR(50) NOT NULL
);

CREATE TABLE IF NOT EXISTS weather
(
    id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (INCREMENT 1 START 1),
    dateTime TIMESTAMPTZ NOT NULL,
    cityId INTEGER NOT NULL,
    climateData json NOT NULL
);

推荐答案

SQL脚本的语法特定于PostgreSQL数据库.要使用H2数据库进行测试,您必须以PostgreSQL兼容性模式启动它.像这样:

spring.datasource.url=jdbc:h2://mem:db;MODE=PostgreSQL

基于:http://www.h2database.com/html/features.html#compatibility

Java相关问答推荐

如何在Java中对自定义协议进行主机名验证?

如何在PFA中使用不确定的进度指标制作可暂停的任务?

Spring Webocket:尽管凭据设置为False,但MLhttpsify和Fetch请求之间的CORS行为存在差异

更新我们的一个文物后出现了严重的符号引用错误

如何审查Java dtos中的自定义注释字段?

Springdoc Whitelabel Error Page with Spring V3

关于泛型的覆盖规则

当Volatile关键字真的是必要的时候?

在JDK 1.8源代码中,为什么使用A-B 0来确定哪个更大,而不是A B?

MimeMessage emlMessage=new MimeMessage(Session,emlInputStream);抛出InvocationTargetException

SpringBoot:在条件{Variable}.isBlank/{Variable}.isEmpty不起作用的情况下进行路径变量验证

基于配置switch 的@Controller的条件摄取

如何使用MapStrCut转换双向链接

从12小时开始的日期模式

嘲笑黄瓜中的对象

在Oracle中调用输出参数在索引处缺少IN或OUT参数的函数

为什么没有加载java.se模块?

多线程、并发和睡眠未按预期工作

读取ConcurrentHashMap中的可变对象

如何显示新布局