如何使用Junit测试处理try / catch和throw

时间:2012-11-14 22:19:40

标签: java exception-handling junit

我对使用Junit处理Java中的异常有点新意,我们将非常感激。

我想做什么:

  • 我围绕使用try创建新的CustomObject,因为当我们调用{{1}时,用户可以传入与String不匹配的enum }。我希望能够在这里捕获一个异常,但是我被告知:“应该避免捕获异常只能重新抛出异常的catch语句。”必须有更好的方法来解决这个问题吗?

  • 如果新对象具有正确的valueof(),则我调用enum,其返回isValidObject。如果boolean无效,则我Integer例外。

  • 我的测试有一个throw并正在通过。

是否有更好/更清洁的方式来使用例外?

我有以下代码:

@Test(expected = AssertionError.class)

哦,如果有人能推荐一些关于异常处理的好东西,那就太好了。

1 个答案:

答案 0 :(得分:5)

  

应该避免捕获异常只能重新抛出异常的catch语句。“。必须有更好的方法来处理它吗?

是的,只需删除try catch即可。您的代码相当于:

private CustomObject getObjectFromString(String objectDataString) {
    if (objectDataString != null) {
        String[] customObjectComponents = objectDataString.split(":");
        CustomObject singleObject = new CustomObject(EnumObjectType.valueOf(customObjectComponents[0]),
                Integer.parseInt(customObjectComponents[1]));
        if (isValidCustomObject(singleObject)) {
            return singleObject;
        } else {
            throw new IllegalArgumentException("Unknown custom object type/value: " + EnumObjectType.valueOf(customObjectComponents[0]) + ":"
                    + Integer.parseInt(customObjectComponents[1]));
        }
    }
}

如果传递给IllegalArgumentException的值无效或者enum.valueOf()方法返回false,则该代码将抛出isValidCustomObject

请注意,如果字符串不包含您可能要在调用IndexOutOfBoundException之前测试的:,它也可能会抛出customObjectComponents[1]。它也可能抛出NumberFormatException。

并且您似乎接受一个空字符串作为有效条目which is probably not a good idea(显然取决于您的用例)。

我可能会这样写:

private CustomObject getObjectFromString(String objectDataString) {
    Objects.requireNonNull(objectDataString, "objectDataString should not be null");
    String[] customObjectComponents = objectDataString.split(":");
    if (customObjectComponents.length != 2) {
        throw new IllegalArgumentException("Malformed string: " + objectDataString);
    }

    EnumObjectType type = EnumObjectType.valueOf(customObjectComponents[0]);
    try {
        int value = Integer.parseInt(customObjectComponents[1]);
    } catch (NumberFormatException e) {
        throw new IllegalArgumentException(customObjectComponents[1] + " is not an integer);
    }

    CustomObject singleObject = new CustomObject(type, value);
    if (isValidCustomObject(singleObject)) {
        return singleObject;
    } else {
        throw new IllegalArgumentException("Unknown custom object type/value: " + type + ":" + value);
    }
}

最后,CustomObject的构造函数可能有意义地检查它的参数是否正常,而不必调用单独的isValid方法。最后一个块就是:

    return new CustomObject(type, value);

如果需要,会从构造函数中抛出IllegalArgumentException。