C# 如何测试异常
我花了一些时间寻找解决问题的方法,但没有成功! 这是我的问题:我有一些代码可以执行以下操作:C# 如何测试异常,c#,unit-testing,exception-handling,C#,Unit Testing,Exception Handling,我花了一些时间寻找解决问题的方法,但没有成功! 这是我的问题:我有一些代码可以执行以下操作: public void DoSomething(){ try{ DoStuffThatCanThrowException(); }catch(Exception e){ // Do nothing... } } 正如您所看到的,try-catch块吞并了可以在dostuffthatchrowexception()中抛出的所有异常。 我正在努力想一种方
public void DoSomething(){
try{
DoStuffThatCanThrowException();
}catch(Exception e){
// Do nothing...
}
}
正如您所看到的,try-catch
块吞并了可以在dostuffthatchrowexception()中抛出的所有异常。
我正在努力想一种方法来编写一个单元测试,它基本上可以确保在dostuffthatchrowexception()
中不会抛出异常。这里的困难在于,我既不能更改try-catch
块,也不能更改dostuffthatchanthrowexception()
方法
如有任何提示,我们将不胜感激
编辑
我忘记提到的一个重要细节是,我不能直接调用dostuffthatchrowexception
,因为它是内部的
,因此从外部世界看不到它。你不能从单元测试本身调用dostuffthatchrowexception,因此根本不被try…catch包围吗
编辑:刚刚看到您的方法是内部的。我建议,为了测试的目的,你可以使用一个公开的方法来包装它。这样你可以暂时测试一些东西。一旦您确定方法不会失败,您就不再需要try…catch了。难道您不能从单元测试本身调用dostuffthatchrowexception,因此根本不需要try…catch吗
编辑:刚刚看到您的方法是内部的。我建议,为了测试的目的,你可以使用一个公开的方法来包装它。这样你可以暂时测试一些东西。一旦你确定这个方法不会失败,你就不再需要尝试了。对不起,答案太乱了,也许反思会帮助你深入研究
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[] {});
很抱歉把答案弄得一团糟,也许反思能帮助你深入研究
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[] {});
在try块中,在调用dostuffthatchRowException()
之后立即添加一个肯定断言。如果发生异常,则不会执行断言。或者,在catch
块中添加一个否定断言。不确定这是否回答了你的问题;不太清楚。在try块中调用dostuffthatchRowexception()
后立即添加一个肯定断言。如果发生异常,则不会执行断言。或者,在catch
块中添加一个否定断言。不确定这是否回答了你的问题;不太清楚。你能直接调用dostuffthatchanthrowexception()
吗?如果不是,则创建包含try-catch块的原始类的子类,并在没有catch块的情况下从那里调用它
class ClassUnderTest extends OriginalClass
{
@Override
public void functionToTest()
{
DoStuffThatCanThrowException()
}
}
此外,测试是否存在异常也很困难。您需要找到所有可能抛出的异常,并围绕这些异常进行测试。即使这样,你所说的只是“进行这些测试,没有抛出异常”。这不如说“永远不会抛出异常”,但通常已经足够了。你能直接调用dostuffthatchronrowexception()
吗?如果不是,则创建包含try-catch块的原始类的子类,并在没有catch块的情况下从那里调用它
class ClassUnderTest extends OriginalClass
{
@Override
public void functionToTest()
{
DoStuffThatCanThrowException()
}
}
此外,测试是否存在异常也很困难。您需要找到所有可能抛出的异常,并围绕这些异常进行测试。即使这样,你所说的只是“进行这些测试,没有抛出异常”。这不如说“永远不会抛出异常”那么有力,但通常已经足够了。看起来像是一种巨大的代码气味。你有什么理由不能改变方法吗?对于你试图证明不能命中异常的东西进行尝试/捕获似乎是一种愚蠢的逻辑。你能控制任何情况(权限、文件存在、配置等)以确保抛出异常吗?似乎你没有进行单元测试,因为您正在测试一个代码单元,并且根据另一个代码单元的结果来验证您的测试。我将分别测试dostuff that canthrowexception(),然后使用依赖项注入模拟对方法的调用另一个选项是为程序集使用InternalsVisibleToAttribute
,您可以访问程序集吗定义了dostuff that canthrowexception
的程序集?看起来像是一个很大的代码气味。你有什么理由不能改变方法吗?对于你试图证明不能命中异常的东西进行尝试/捕获似乎是一种愚蠢的逻辑。你能控制任何情况(权限、文件存在、配置等)以确保抛出异常吗?似乎你没有进行单元测试,因为您正在测试一个代码单元,并且根据另一个代码单元的结果来验证您的测试。我会分别测试dostuff that canthrowexception(),然后使用依赖项注入模拟对该方法的调用。另一种选择是对程序集使用InternalsVisibleToAttribute
,你能访问中定义了dostuff that canthrowexception
的程序集吗?他说“这里的困难在于,我既不能更改try-catch块,也不能更改dostuffthatchrowexception()方法。”@CookieMonester这是不可能的,我不能更改这段代码:(+1这是最接近的答案,似乎有机会工作,谢谢他说”这里的困难在于,我既不能更改try-catch块,也不能更改dostuffthatchrowexception()方法。“@cookieMonster这是不可能的,我不能更改这段代码:(+1这是最接近的答案,似乎有机会奏效,谢谢谢谢谢谢你的回答,很遗憾这是不可能的。请参阅我的编辑谢谢你的回答,很遗憾这是不可能的。请参阅我的编辑