在不更改其当前实现的情况下,是否有任何可行的方法测试,其中Exception
被下面的Java方法中的catch块所捕获。
public String methodToTest(String text) {
try
{
if (text.contains("something")) {
throw new CustomException();
}
final MyObj myObj = new MyObj(text); //this can throw a MyObjException
return text;
} catch (CustomException e) {
return "An exception has been thrown";
} catch (MyObjException e) {
return "An exception has been thrown";
} catch (Exception e) {
return "An exception has been thrown";
}
}
答案 0 :(得分:2)
如果您的任务是出于测试目的将该功能视为“黑匣子”,则唯一的选择是依靠其返回值,因为 it 会捕获异常。
如果每种情况下的返回值都相同,则根本无法区分它们。
您测试功能的尝试不应依赖于其实现的知识,也不应实质性地改变功能的运行方式。因此,我认为这是不幸的答案。
答案 1 :(得分:2)
您不应测试该方法的实现,而应测试对该方法的期望。以下是您提供的方法的一些示例:
text
的{{1}}会收到"something"
:测试:
"An exception has been thrown"
String result = obj.methodToTest("my_something_string");
assertEquals("An exception has been thrown", result);
的{{1}}收到text
:测试:
null
"An exception has been thrown"
无效的String result = obj.methodToTest(null);
assertEquals("An exception has been thrown", result);
不能收到text
测试:
MyObj
以相同的方式测试其他预期情况。不要测试实现。