在Java中测试try-catch块

时间:2018-11-07 14:47:24

标签: java unit-testing testing exception

在不更改其当前实现的情况下,是否有任何可行的方法测试,其中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";
    }
}

2 个答案:

答案 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

以相同的方式测试其他预期情况。不要测试实现。

相关问题