有没有办法模拟没有公共构造函数的DB2Exception?

时间:2013-01-25 23:04:17

标签: .net unit-testing mocking db2

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

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

我是不是无法测试这种互动?

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

2 个答案:

答案 0 :(得分:1)

我希望DB2Exception有一些派生类,但是唉 - 不,它是密封的。 Here's the class description

由于某人显然抛出了DB2Exceptions,因此可能有一个internal构造函数。你将不得不诉诸于反射来使用它。曾经有一个.NET Reflector分析了MSIL并生成了C#代码,但现在它需要花钱。你可以找到一些alternatives here

答案 1 :(得分: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));
}

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