如何故意抛出错误来测试数据库回滚?
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".
污染你的生产代码
我的应用程序中有以下代码:
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".
污染你的生产代码