使用 H2 数据库进行 JUNIT 测试时出现错误 "expected identifier"
Getting error "expected identifier" while using H2 Database for JUNIT Testing
我正在尝试为我的 SpringBoot 微服务编写 JUNIT 测试用例。我使用了 H2 数据库。这是我的测试用例 -
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = DBSetUp.class)
@SpringBootTest(classes = ClassToBeTested.class)
public class ClassToBeTested{
@Autowired
private ClassToBeTested classToBeTested;
@Test
public void saveRandomTableTest(){
Number number = null;
RandomTableData randomTableData = new RandomTableData("XYZ", "XYZ WXY");
number = classToBeTested.saveRandomTable(randomTableData );
Assert.assertNotNull(number);
}
我正在尝试测试的 class(ClassToBeTested.class) 看起来像这样 -
private static final String INSERT_RANDOMTABLE_SQL = "INSERT INTO RANDOM_USER.RANDOMTABLE VALUES ( RANDOM_USER.RANDOMTABLE_SEQ.nextval, ?, ?)";
private static final String[] RANDOMTABLE_PRIMARY_KEY = {"RANDOMTABLE_ID"};
public Number saveRandomTable(RandomTableData randomTableData ) {
Number id = null;
try{
PreparedStatementCreator psc = new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement preparedStmt = connection.prepareStatement(INSERT_RANDOMTABLE_SQL, RANDOMTABLE_PRIMARY_KEY);
prepareStatement(preparedStmt, randomTableData);
return preparedStmt;
}
};
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(psc, keyHolder);
id = keyHolder.getKey();
}catch(Exception e){
LOGGER.error("Error is "+ e.getMessage());
}
return id;
}
而 DBSetUp.class 看起来像这样 -
CREATE SCHEMA IF NOT EXISTS "RANDOM_USER";
CREATE SEQUENCE IF NOT EXISTS RANDOMTABLE_SEQ START WITH 1 INCREMENT BY 1;
CREATE TABLE IF NOT EXISTS "RANDOM_USER"."RANDOMTABLE"(
RANDOMTABLE_ID NUMBER PRIMARY KEY,
RANDOMTABLE_CODE VARCHAR2(50),
RANDOMTABLE_NAME VARCHAR2(50)
);
但是每当我试图在这个 JUNIT 测试用例中得到这样的结果时 -
ERROR : bad SQL grammar []; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error
in SQL statement "INSERT INTO RANDOM_USER.RANDOMTABLE VALUES ( RANDOM_USER.RANDOMTABLE_SEQ.nextval,
[*] ?, ?)"; expected "identifier"; SQL statement:INSERT INTO RANDOM_USER.RANDOMTABLE VALUES (
RANDOM_USER.RANDOMTABLE_SEQ.nextval, ?, ?) [42001-200]
实际上这个应用程序使用的是 Oracle 数据库。所有 SQL 采石场都适合该应用程序。我只是在使用 H2 DB 进行 JUNIT 测试时收到此错误。我需要添加 H2 DB 的任何特定语法吗?如果是,那么它也需要与 Oracle 一起工作。
你需要改变
CREATE SEQUENCE IF NOT EXISTS RANDOMTABLE_SEQ START WITH 1 INCREMENT BY 1;
到
CREATE SEQUENCE IF NOT EXISTS RANDOM_USER.RANDOMTABLE_SEQ START WITH 1 INCREMENT BY 1;
或在该命令之前将当前架构更改为 RANDOM_USER
;否则序列将在默认 PUBLIC
模式中创建。
我正在尝试为我的 SpringBoot 微服务编写 JUNIT 测试用例。我使用了 H2 数据库。这是我的测试用例 -
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = DBSetUp.class)
@SpringBootTest(classes = ClassToBeTested.class)
public class ClassToBeTested{
@Autowired
private ClassToBeTested classToBeTested;
@Test
public void saveRandomTableTest(){
Number number = null;
RandomTableData randomTableData = new RandomTableData("XYZ", "XYZ WXY");
number = classToBeTested.saveRandomTable(randomTableData );
Assert.assertNotNull(number);
}
我正在尝试测试的 class(ClassToBeTested.class) 看起来像这样 -
private static final String INSERT_RANDOMTABLE_SQL = "INSERT INTO RANDOM_USER.RANDOMTABLE VALUES ( RANDOM_USER.RANDOMTABLE_SEQ.nextval, ?, ?)";
private static final String[] RANDOMTABLE_PRIMARY_KEY = {"RANDOMTABLE_ID"};
public Number saveRandomTable(RandomTableData randomTableData ) {
Number id = null;
try{
PreparedStatementCreator psc = new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement preparedStmt = connection.prepareStatement(INSERT_RANDOMTABLE_SQL, RANDOMTABLE_PRIMARY_KEY);
prepareStatement(preparedStmt, randomTableData);
return preparedStmt;
}
};
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(psc, keyHolder);
id = keyHolder.getKey();
}catch(Exception e){
LOGGER.error("Error is "+ e.getMessage());
}
return id;
}
而 DBSetUp.class 看起来像这样 -
CREATE SCHEMA IF NOT EXISTS "RANDOM_USER";
CREATE SEQUENCE IF NOT EXISTS RANDOMTABLE_SEQ START WITH 1 INCREMENT BY 1;
CREATE TABLE IF NOT EXISTS "RANDOM_USER"."RANDOMTABLE"(
RANDOMTABLE_ID NUMBER PRIMARY KEY,
RANDOMTABLE_CODE VARCHAR2(50),
RANDOMTABLE_NAME VARCHAR2(50)
);
但是每当我试图在这个 JUNIT 测试用例中得到这样的结果时 -
ERROR : bad SQL grammar []; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error
in SQL statement "INSERT INTO RANDOM_USER.RANDOMTABLE VALUES ( RANDOM_USER.RANDOMTABLE_SEQ.nextval,
[*] ?, ?)"; expected "identifier"; SQL statement:INSERT INTO RANDOM_USER.RANDOMTABLE VALUES (
RANDOM_USER.RANDOMTABLE_SEQ.nextval, ?, ?) [42001-200]
实际上这个应用程序使用的是 Oracle 数据库。所有 SQL 采石场都适合该应用程序。我只是在使用 H2 DB 进行 JUNIT 测试时收到此错误。我需要添加 H2 DB 的任何特定语法吗?如果是,那么它也需要与 Oracle 一起工作。
你需要改变
CREATE SEQUENCE IF NOT EXISTS RANDOMTABLE_SEQ START WITH 1 INCREMENT BY 1;
到
CREATE SEQUENCE IF NOT EXISTS RANDOM_USER.RANDOMTABLE_SEQ START WITH 1 INCREMENT BY 1;
或在该命令之前将当前架构更改为 RANDOM_USER
;否则序列将在默认 PUBLIC
模式中创建。