Java 如何使用重新引用的异常测试代码?
我的android应用程序中有一段代码,它捕获一个异常并将其作为另一个异常重新引用,这是从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
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
}