java - 使用 H2 数据库进行 JUNIT 测试时出现错误 "expected identifier"

标签 java spring h2 junit4

我正在尝试为我的 SpringBoot Micro 服务编写 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);
}

我试图测试的类(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 DB。所有 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 架构中创建。

关于java - 使用 H2 数据库进行 JUNIT 测试时出现错误 "expected identifier",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61318384/

相关文章:

java - 连接到URL失败,但是当我直接在浏览器中尝试时,它成功了

java - 为什么spring websocket应用程序看不到html并抛出404错误?

java - JPA:反向映射字段上的查询子句 - 未设置参数

sql - 如何使用 JDBC 调用带有命名参数的 Sybase 存储过程

PostgreSQL 到 H2 引擎 : Data source setup issues

java - 从星期几整数java获取日期字符串

java - JSR-303 注释字段与 Getter

java - 如何跳过测试代码或将oracle语法转换为h2

java - 在同一个类中克隆函数

java - 从 Spring 应用程序停止并重新启动基于文件的 H2 数据库