1

我正在编写单元测试,我想模拟DB2Exception抛出 a 的场景。

问题是它没有公共构造函数,所以我不能创建它,而且大多数单元测试框架(我使用带有 nunit 的 Rhino Mocks)也不能为它们创建存根。

我是否坚持无法测试这种交互?

(详细信息:这是在- 版本 8.1.2.1中DB2Exception定义的)IBM.Data.DB2.dll

4

2 回答 2

1

我希望DB2Exception有一些派生类,但可惜 - 不,它是密封的。这是类描述

由于 DB2Exceptions 显然是由某人抛出的,因此可能有一个internal构造函数。您必须借助反射才能使用它。曾经有一个 .NET Reflector 可以分析 MSIL 并生成 C# 代码,但现在它需要花钱。你可以在这里找到一些替代品

于 2013-01-25T23:11:54.260 回答
1

编辑我以前的帖子根本没有帮助,这是我的第二次尝试。虽然您可能仍想在此执行一些模拟元素,但无需查看您的代码,我不知道这种方法的哪些元素会起作用,哪些不会。无论如何,这是我在尝试测试 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));
}

这不是处理这个问题的最优雅的方法,但如果你不能排除异常,那么我猜想,通过触发异常来分开代码的职责并分别测试每个部分是下一个最好的事情。

于 2013-01-25T23:39:28.943 回答