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

标签 java oracle unit-testing h2

我和我的团队正在使用 Oracle 数据库进行开发和生产。但为了节省时间,我们决定使用H2数据库进行测试,因为它速度很快。

现在我们遇到了一个与 SQL 语法相关的问题。

public void lock(Collection<String> locks) {
    if (locks== null || locks.size() == 0)
        return;

    Connection dbc = null;
    Statement st = null;
    String q = null;
    try {
        dbc = db.getConnection();
        dbc.setAutoCommit(false);
        st = dbc.createStatement();
        st.setFetchSize(fetchSize);
        q = "LOCK TABLE resource_lock IN EXCLUSIVE MODE";
        st.executeUpdate(q);

        // Update the lock info in DB
        List idLists = DbUtil.splitIdList(locks);
        Iterator i = idLists.iterator();
        while (i.hasNext()) {
            List idList = (List) i.next();
            q =
                "DELETE FROM resource_lock\n" +
                "WHERE " + DbUtil.generateStrIn("lock", idList);
            st.executeUpdate(q);
        }

        st.close();
        st = null;
        dbc.commit();
        dbc.close();
        dbc = null;
    } catch (SQLException e) {
        throw new DbException(e, q);
    } finally {
        DbUtil.cleanup(log, null, st, dbc);
    }
}

问题发生于 “以独占模式锁定表资源锁” 这是 Oracle 独有的语法。在我编写的测试中,它总是抛出语法错误,其中指出

Caused by: com.resource.db.DbException: Database Error: Syntax error in SQL statement "LOCK[*] TABLE RESOURCE_LOCK IN EXCLUSIVE MODE "; SQL statement:
LOCK TABLE resource_lock IN EXCLUSIVE MODE [42000-160]
Last SQL was:
LOCK TABLE resource_lock IN EXCLUSIVE MODE

我想知道 H2 是否有具有等效操作的语法。 如果没有,那么我想知道如何跳过本节进行测试,因为许多其他类方法使用它来更新数据库。 我不希望其他测试因此而失败。

最佳答案

要对不同的数据库使用不同的 SQL 命令,您可以为您的应用程序创建一个 DAO 层:

  • 使用 deleteLock()
  • 等方法创建接口(interface)
  • 在您的应用程序逻辑中,使用此方法而不是直接 SQL 查询
  • 为不同的数据库创建 DAO 接口(interface)的多个实现
  • 将“Oracle”实现与 Oracle DB 结合使用,将“H2”实现与 H2 结合使用

当然,测试与生产中运行的实现不同的实现存在风险,但这就是您已经在做的事情。

<小时/>

示例:

我的服务:

private LockDao lockDao;
...
public void lock(Collection<String> locks) {
    ...
    lockDao.deleteLocks(locks);
    ...
}

LockDao:

public void deleteLocks(Collection<String> locks);

OracleLockDao:

@Override
public void deleteLocks(Collection<String> locks) {
    ...
    q = "LOCK TABLE resource_lock IN EXCLUSIVE MODE";
    st.executeUpdate(q);
    ...
        q =
            "DELETE FROM resource_lock\n" +
            "WHERE " + DbUtil.generateStrIn("lock", idList);
        st.executeUpdate(q);
    ...
}

H2LockDao:

@Override
public void deleteLocks(Collection<String> locks) {
    // H2 implementation of lock deletion
}

关于java - 如何跳过测试代码或将oracle语法转换为h2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33418546/

相关文章:

sql - TO_DATE函数时区解析错误

java.sql.sqlexpcetion :ORA-00917:missing comma

oracle - 使用pl/sql更新序列

unit-testing - 使用 Google 测试框架时如何添加超时以进行测试

java - Mockito - 验证方法是否重启次数?

java - 如何构建一个数组并将其与另一个数组进行比较?

java - 在 Eclipse 中撤消换行效果?

java - 如何使用java中的jfreechart为散点图中的每个点分配不同的颜色?

java - 使用 Jackson Serialize,如何序列化双值 null 并且在 0.0 时不返回

asp.net-mvc - ASP.NET MVC 单元测试 - session