Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用重新引用的异常测试代码?_Java_Android_Testing_Exception Handling - Fatal编程技术网

Java 如何使用重新引用的异常测试代码?

Java 如何使用重新引用的异常测试代码?,java,android,testing,exception-handling,Java,Android,Testing,Exception Handling,我的android应用程序中有一段代码,它捕获一个异常并将其作为另一个异常重新引用,这是从RuntimeException扩展而来的自定义异常。而且它似乎不可能被测试 请看下面的代码: try { ... } catch (MalformedURLException e) { throw new CustomMalformedDataException(downloadUrlString, e); } 当我尝试测试异常情况时,我写: @Test(expected = Custom

我的android应用程序中有一段代码,它捕获一个异常并将其作为另一个异常重新引用,这是从
RuntimeException
扩展而来的自定义异常。而且它似乎不可能被测试

请看下面的代码:

 try { ... } catch (MalformedURLException e) {
     throw new CustomMalformedDataException(downloadUrlString, e);
 }
当我尝试测试异常情况时,我写:

@Test(expected = CustomMalformedDataException.class)
public void exceptionsTest() throws Exception {
    <code triggering the exception>
}
我得到
java.lang.Exception:意外异常,应为,但为

那么我应该如何测试这个案例呢

异常类代码:

public class CustomMalformedDataException extends RuntimeException {

    public CustomMalformedDataException(String message, Throwable cause) {
        super(message, cause);
    }

    public CustomMalformedDataException(String url, MalformedURLException cause) {
        super("The package has an invalid \"downloadUrl\": " + url, cause);
    } 
}

更新:无论哪种方式,测试似乎都会在抛出初始异常时停止执行,即使它被捕获。但是,如果这个异常是预期的,那么执行将继续并抛出另一个异常,这已经不是预期的异常。

所以我尝试了您的代码并得到了一个不同的错误,所以我不能给您一个答案,但我有一种测试错误的方法,我更喜欢使用JUnit来获得您需要的结果

@Rule
public final ExpectedException exception = ExpectedException.none();

@Test
public void testExceptionOccurs() throws Exception {
    exception.expect(CustomMalformedDataException.class);
    //code that casues exception to happen
}
我已经运行过很多次了,当我需要测试我的异常是否发生时,它可以正常工作。我希望这至少能帮助您解决编写异常测试的问题


如果您真的需要测试
RuntimeException
,那么让您的测试抛出
RuntimeException
,而不是
Exception

您的junit版本是什么?我使用4.12版本这更好,但是现在我得到了
预期的:CustomMalformedDataException的一个实例,但是:是java.util.concurrent.ExecutionException
,因此此代码应该按原样工作。如果看不到更多的代码库,很难说问题出在哪里。从错误中可以看出,您正在传递某个ExecutionException实例,该实例是CustomMalformedDataException,因此最好看看您是如何构造您的异常的。这可能是对的,因为自定义异常是从运行时异常扩展而来的,所以这就是问题所在。您不应该从
RuntimeException
扩展,而应该从
Exception
扩展。如果您阅读,您会看到它说“…Java编程语言不需要方法来捕获或指定未检查的异常(RuntimeException、Error及其子类)”
RuntimeException
应该表示编程问题,因此,不希望您的应用程序能够从它们中恢复或以任何方式处理它们。如果您希望从
异常中恢复
,那么它应该是一个选中的异常。但是,如果您希望应用程序无法恢复,则可以使用未经检查的异常。
@Rule
public final ExpectedException exception = ExpectedException.none();

@Test
public void testExceptionOccurs() throws Exception {
    exception.expect(CustomMalformedDataException.class);
    //code that casues exception to happen
}