如何故意抛出错误来测试数据库回滚?

How to purposely throw an error to test database rollback?

我的应用程序中有以下代码:

try {
    //start transaction
    repository.startTransaction();

    //carry out deletion logic
    repository.deletedata()

    //commit all 3 transactions
    repository.commitTransaction();

} catch (Exception e) {    
    repository.rollback();
}

我如何在这段代码中故意抛出一个 error 来测试数据是否被正确回滚

你在这里测试错误。

您应该改为做两件事:编写一个测试以确保您的 rollback 方法执行它承诺的操作。你在旁边测试一下。

然后你有另一个 unit 测试,它只是确保只要你的 try 块中有异常,预期的调用 rollback 发生。

如果你真的想做一个 functional 测试,做端到端测试包括回滚,那么你必须添加一些 injection 机制,类似于:

interface ErrorInject {
  void throwException();
}

在你的 try 块中,你会有类似的东西:

try {
  repository.startTransaction();
  inject1.throwException();
  repository.deletedata()
  inject2.throwException();
  repository.commitTransaction();
}

默认情况下,这两个 "inject" 对象什么都不做;但是对于您的测试用例,您要确保这两个对象之一确实抛出异常。

但是当然 - 您不想在生产代码中执行类似的操作。所以 - 你最好退后一步,想想我的第一个建议是否适合你。

一个替代方案可以是面向方面的编程;这可能允许您使用一些注释来指示您的框架在某个方法调用时失败。但正如所说:你不应该用 "testing aspects".

污染你的生产代码