我有一个使用 PostgreSQL 和 Flyway 的 Spring Boot 项目。我想测试 UserRepository 所以我添加了一个 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
这是 UserRepository 代码:
@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 = "[email protected]";
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
);
由于现在您使用的是 H2 数据库而不是 PostgreSQL 数据库,请尝试将所有表中的主键列替换为
GENERATED ALWAYS AS IDENTITY
。