java - 测试用例后使用SQL回滚,但被测方法使用commit

标签 java postgresql jdbc junit automated-tests

我正在尝试为我们应用程序的一种数据库访问方法编写单元测试。我们有一个专用的测试数据库(实时数据库的定期转储/副本)。通常每个测试用例在单个事务中运行,然后回滚。我们通过在测试用例之前使用 Connection.setAutoCommit(false) 并在之后使用 Connection.rollback() 来实现这一点。

但是这一次,我正在尝试为一种方法编写测试,该方法本身将所有事情都作为一个事务处理,并在最后使用 Connection.commit()

有没有一种方法可以让 commit 不实际提交到数据库,而不会在被测试的方法中引发错误?也就是说,我怎样才能防止这个测试用例真正改变测试数据库的内容?

注意事项:使用 Java、JDBC 和 Junit。 java.sql.Connection 用于数据库连接,java.sql.PreparedStatement 用于运行查询。

@Before 和@After 代码:

/**
 * Obtain a new connection and set autoCommit to false.
 * This lets us run a test case then revert all of the changes
 * so the test cases don't interfere with each other.
 */
@Before
public void initConnection() {
    conn = Database.getConnection();
    try {
        conn.setAutoCommit(false);
    } catch (SQLException e) {
        e.printStackTrace();
        fail("Unable to set connection AutoCommit=false");
    }
}

/**
 * Rollback the changes made by the test case
 * and close the connection.
 */
@After
public void rollbackConnection() {
    try {
        conn.rollback();
    } catch (SQLException e) {
        e.printStackTrace();
        fail("Unable to rollback");
    }
    Database.closeConnection(conn);
}

最佳答案

你为什么要这样做?如果您正在编写一个适当的测试,您可能希望验证数据确实已经提交并且符合您试图完成的任何事情。如果您担心更改,请在完成后清理它们。

但是,如果确实有正当理由,您可以删除交易 (txn) 代码,编写一个辅助函数,将函数调用包装在交易中,让客户调用该辅助函数,测试代码调用原始代码。这可能不是解决问题的最佳方法,而是一种选择。

关于java - 测试用例后使用SQL回滚,但被测方法使用commit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24435275/

相关文章:

java - 从 Java 字符串列表中跟踪回文

java - 我如何残酷无情地中止 Java 中的任务?

java - LWJGL 旋转 : Won't rotate

java - 与 Java 应用程序相比,Tomcat8 中的 JDBC 性能非常非常慢

java - 使用 Statement.RETURN_GENERATED_KEYS 例程从表中检索最后插入的身份 ID?

java - 使用 JOOQ 从 SYBASE DB 生成元模型代码时出错

sql - 正则表达式匹配中的列

postgresql - 对于不存在的行,Redshift SELECT * 性能与 COUNT(*)

postgresql - 解决 PostgresQL 中的 "ssl handshake failure"错误

mysql - Sqoop增量追加