如何测试吞下的异常

时间:2012-03-26 20:37:39

标签: c# unit-testing exception-handling

我花了一些时间寻找解决问题的方法,但没有成功! 这是我的问题:我有一些代码可以执行以下操作:

public void DoSomething(){
    try{
       DoStuffThatCanThrowException();
    }catch(Exception e){
       // Do nothing...
    }
}

如您所见,try catch块吞下了DoStuffThatCanThrowException()中可以抛出的所有异常。 我正在努力思考一种编写单元测试的方法,该方法基本上确保DoStuffThatCanThrowException()中不会抛出任何异常。这里的困难是我既不能改变try catch块也不能改变DoStuffThatCanThrowException()方法。

任何提示都受到高度赞赏。

修改 我忘记提及的一个重要细节是,我无法直接调用DoStuffThatCanThrowException,因为它是internal因此从外部世界看不到。

4 个答案:

答案 0 :(得分:3)

难道你不能从单元测试本身调用DoStuffThatCanThrowException,因此不会被try ... catch包围吗?

修改:刚看到您的方法是内部的。我建议你为测试目的制作一个包装它的公共方法。这样你就可以暂时测试一下。一旦你确定方法不会失败,你就不再需要try ... catch了。

答案 1 :(得分:2)

很抱歉答案很糟糕,也许反思可以帮助你深入挖掘?

ClassContainingInternalMethod cl = new ClassContainingInternalMethod ();

//any private or internal method you want here.
MethodInfo dynMethod = 
cl.GetType().GetMethod("DoSomeStuff", BindingFlags.NonPublic | BindingFlags.Instance);

dynMethod.Invoke(cl, new object[] {});

答案 2 :(得分:1)

您可以直接致电DoStuffThatCanThrowException()吗?如果没有,请创建包含该try catch块的原始类的子类,并在没有catch块的情况下从那里调用它。

class ClassUnderTest extends OriginalClass
{
    @Override
    public void functionToTest()
    {
             DoStuffThatCanThrowException()
    }

}

此外,测试没有例外是很困难的。您需要找到可抛出的所有潜在异常并对其进行测试。即使这样,你所说的只是“给出这些测试,没有抛出异常”。这不如说“永远不会抛出异常”,但通常足够好。

答案 3 :(得分:0)

在try块中调用DoStuffThatCanThrowException()后立即添加一个肯定的断言。如果发生异常,则不会执行断言。或者,在catch块内添加否定断言。不确定这是否能回答你的问题;它不是很清楚。