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

Java 如何使用Junit测试处理try/catch和throw,java,exception-handling,junit,Java,Exception Handling,Junit,我对使用Junit在Java中处理异常有点陌生,如果您能提供一些指导,我将不胜感激 我想做的是: 我用一个try来围绕新CustomObject的创建,因为当我们调用valueof()时,用户可以传入一个与enum不匹配的字符串。我想在这里捕获一个异常,我就是这样,尽管有人告诉我:“一个捕获异常的catch语句只是为了重新引用它,应该避免它。”。一定有更好的方法来处理这个问题 如果新对象具有正确的enum,那么我调用isValidObject,它返回一个布尔值。如果整数无效,则我抛出一个异常

我对使用Junit在Java中处理异常有点陌生,如果您能提供一些指导,我将不胜感激

我想做的是:

  • 我用一个
    try
    来围绕新CustomObject的创建,因为当我们调用
    valueof()
    时,用户可以传入一个与
    enum
    不匹配的
    字符串。我想在这里捕获一个异常,我就是这样,尽管有人告诉我:“一个捕获异常的catch语句只是为了重新引用它,应该避免它。”。一定有更好的方法来处理这个问题

  • 如果新对象具有正确的
    enum
    ,那么我调用
    isValidObject
    ,它返回一个
    布尔值。如果
    整数
    无效,则我
    抛出一个异常

  • 我的测试有一个
    @test(expected=AssertionError.class)
    ,正在通过

是否有更好/更干净的方法来使用异常

我的代码如下:

private CustomObject getObjectFromString(String objectDataString) {
        if (objectDataString != null) {
            String[] customObjectComponents = objectDataString.split(":");
            try {
                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]));
                }
            } catch (IllegalArgumentException e) {
                throw e;
            }

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

应该避免使用捕获异常只是为了重新引用它的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]));
        }
    }
}
如果传递给
enum.valueOf()
的值无效,或者如果
isValidCustomObject
方法返回false,则该代码将抛出
IllegalArgumentException

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

您似乎接受空字符串作为有效条目(显然取决于您的用例)

我可能会这样写:

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

一个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]));
        }
    }
}
如果传递给
enum.valueOf()
的值无效,或者如果
isValidCustomObject
方法返回false,则该代码将抛出
IllegalArgumentException

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

您似乎接受空字符串作为有效条目(显然取决于您的用例)

我可能会这样写:

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。

回答得很好。谢谢你!另外,关于空处理的链接可能是我很久以来读过的最有用的东西。你可能会喜欢。我认为这是最有意义的,也是处理空值的标准方法——证实了这一点。回答很好。谢谢你!另外,关于空处理的链接可能是我很久以来读过的最有用的东西。你可能会喜欢。我认为这是最有意义的,也是处理null的标准方法-确认它。