我知道如何断言抛出异常。但是,我如何断言抛出异常并成功捕获?例如,假设我有一个方法应该为无效输入抛出特定类型的异常
public static void myMethod(String value) {
try {
someExternalMethod(value);// can throw IllegalArgumentException
} catch (IllegalArgumentException e) {
System.out.println("Let me handle it differently");
} catch (Exception e) {
System.out.println("Not IllegalArgumentException");
}
}
现在我想断言,对于某些值,该方法确实抛出了'IllegalArgumentException'而不是其他一些异常。
答案 0 :(得分:1)
您错过了单元测试的重点 - 测试应该测试行为,而不是实现。
鉴于此假设,您应该在myMethod
发生时测试IllegalArgumentException
的行为是否符合预期。对于给定参数的方法,很难说除了那个,String
是不可变的,没有返回值,也没有抛出异常。
一个更好的例子可能是这种方法(这有点用来证明这一点):
public double divide(int numerator, int denominator)
{
try
{
return numerator / denominator;
}
catch (ArithmeticException e)
{
return Double.NaN;
}
}
你的测试会断言除法是正确的,并且当发生错误时{1}}被返回,如下所示:
NaN
然后你可以像这样重写@Test
public void testDivide()
{
assertEquals(2.0, divide(4, 2), 0);
}
@Test
public void testDivideByZero()
{
assertTrue(Double.isNaN(divide(1, 0));
}
方法:
divide
测试将确认我的系统的运行,因为public double divide(int numerator, int denominator)
{
if (denominator == 0)
{
return Double.NaN;
}
else
{
return numerator / denominator;
}
}
方法的行为保持不变。
答案 1 :(得分:0)
catch
块按它们的顺序进行评估。
您的代码运行正常:如果IllegalArgumentException
,Exception
阻止将被忽略。
答案 2 :(得分:0)
在测试myMethod
的情况下,您不能(更重要的是,您不应该)检查someExternalMethod
是否已抛出IllegalArgumentException
。实际上,您对myMethod
的测试不应假设已调用someExternalMethod
:它是myMethod
的实现细节。
myMethod
捕获这些异常的原因是将它们隐藏在呼叫者之外。您应该通过传递导致它们的值来检查这些异常是否对您隐藏,并验证在这两种情况下都不会抛出任何内容。
测试someExternalMethod
及其引发的异常是通过测试someExternalMethod
完成的任务,而不是myMethod
。
答案 3 :(得分:0)
someExternalMethod(value)
强行抛出Exception
测试方法myMethod
,检查没有抛出异常:
@Test
public void testMyMethod() {
try {
myMethod("value");
} catch (Exception ex) {
Assert.fail();
}
}