我正在编写单元测试,我想模拟DB2Exception
抛出 a 的场景。
问题是它没有公共构造函数,所以我不能创建它,而且大多数单元测试框架(我使用带有 nunit 的 Rhino Mocks)也不能为它们创建存根。
我是否坚持无法测试这种交互?
(详细信息:这是在- 版本 8.1.2.1中DB2Exception
定义的)IBM.Data.DB2.dll
我正在编写单元测试,我想模拟DB2Exception
抛出 a 的场景。
问题是它没有公共构造函数,所以我不能创建它,而且大多数单元测试框架(我使用带有 nunit 的 Rhino Mocks)也不能为它们创建存根。
我是否坚持无法测试这种交互?
(详细信息:这是在- 版本 8.1.2.1中DB2Exception
定义的)IBM.Data.DB2.dll
编辑我以前的帖子根本没有帮助,这是我的第二次尝试。虽然您可能仍想在此执行一些模拟元素,但无需查看您的代码,我不知道这种方法的哪些元素会起作用,哪些不会。无论如何,这是我在尝试测试 catch 块或一般异常时采用的一种方法:
public class A
{
public void ExecuteDB2Query(string query, DB2Connection connection)
{
try
{
// Code for executing the DB2 query
}
catch(DB2Exception ex)
{
// Catch block you are trying to test
}
}
// Actual method
public void MyMethod()
{
var query = "Select * FROM TableInApplication";
var connection = new DB2Connection("DATABASE=GOODDB");
ExecuteDB2Query(query, connection);
}
}
[Test]
public void MyMethod_CallsExecutDB2Query()
{
// Test that MyMethod is calling ExecuteDB2Query
}
// Intentionally pass it bad data to test your catch block
// under the notion that the code that executes in the application
// will be using the same method and thus the same catch block
[Test]
public void ExecuteDB2Query_Handles_Exception()
{
var queryString = "Select* FROM NonExistentTable";
var connection = new DB2Connection("DATABASE=BADDB");
var aClass = new A();
Assert.Throws<DB2Exception>(() => aClass.ExecuteDB2Query(queryString, connection));
}
这不是处理这个问题的最优雅的方法,但如果你不能排除异常,那么我猜想,通过触发异常来分开代码的职责并分别测试每个部分是下一个最好的事情。