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

Java 如何跳过测试代码或将oracle语法转换为h2,java,oracle,unit-testing,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; Strin

我和我的团队正在使用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);
    }
}
我想知道是否有H2的语法具有等效的操作。 若并没有,那个么我想知道如何跳过这一部分进行测试,因为许多其他类方法都使用它来更新数据库。
我不希望其他测试因此而失败。

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

  • 使用类似于
    deleteLock()
    的方法创建接口
  • 在应用程序逻辑中,使用此方法而不是直接SQL查询
  • 为不同的数据库创建DAO接口的多个实现
  • 在Oracle DB中使用“Oracle”实现,在H2中使用“H2”实现
当然,测试与将在生产中运行的实现不同的实现会带来风险,但这是您已经在做的事情


示例:

我的服务:

private LockDao lockDao;
...
public void lock(Collection<String> locks) {
    ...
    lockDao.deleteLocks(locks);
    ...
}
私有锁道锁道;
...
公共无效锁(集合锁){
...
lockDao.deleteLocks(锁);
...
}
洛克道:

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);
    ...
}
@覆盖
公共无效删除锁(集合锁){
...
q=“锁定表资源\u在独占模式下锁定”;
st.executeUpdate(q);
...
q=
“从资源\u锁中删除\n”+
“其中”+DbUtil.generateStrIn(“锁”,idList);
st.executeUpdate(q);
...
}
H2洛克道:

@Override
public void deleteLocks(Collection<String> locks) {
    // H2 implementation of lock deletion
}
@覆盖
公共无效删除锁(集合锁){
//H2锁删除的实现
}

恕我冒犯,但你究竟如何在与开发和生产完全不同的平台上进行测试,并假设你的测试在任何方面都是有效的?这就像在人行道上开发和赛车,但在海洋中进行测试…@user3659052这和在平台上测试没什么两样。你错了。另一个例子是为什么在不同的DBMS上进行测试不是一个好主意,而不是在生产中使用的DBMS。我们在H2中进行测试的原因是因为它很快,并且我们不希望在生产数据库中测试数据。是的,但是你已经将所有SQL嵌入到一个数据访问层,除非它为各种底层DBs提供接口,否则它包括DBMS特定的语法。如果希望支持多个底层平台,则需要公开应用程序代码使用的通用接口,该接口隐藏了底层操作。当然,我甚至不会问你为什么要锁满桌子。如果你有任何重要的用户群在做并发事务,这将咬你-硬!你到底是什么意思?你能举个例子吗?
@Override
public void deleteLocks(Collection<String> locks) {
    // H2 implementation of lock deletion
}