如何通过重新抛出异常来测试代码?

时间:2018-01-18 11:18:42

标签: java android testing exception-handling

我的android应用程序中有一段代码捕获了一个异常,并将其重新抛出为另一个从RuntimeException扩展的自定义异常。似乎无法进行测试。

看看以下代码:

 try { ... } catch (MalformedURLException e) {
     throw new CustomMalformedDataException(downloadUrlString, e);
 }

当我尝试测试异常情况时,我写道:

@Test(expected = CustomMalformedDataException.class)
public void exceptionsTest() throws Exception {
    <code triggering the exception>
}

但我得到 Test running failed: Instrumentation run failed due to 'java.net.MalformedURLException'

当我写:

@Test(expected = MalformedURLException.class)
public void exceptionsTest() throws Exception {
    <code triggering the exception>
}

我得到 java.lang.Exception: Unexpected exception, expected<java.net.MalformedURLException> but was<CustomMalformedDataException>

那我该如何测试这个案例?

例外类代码:

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);
    } 
}

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

1 个答案:

答案 0 :(得分:1)

所以我尝试了你的代码并得到了一个不同的错误,所以我不能给你一个答案,但我有一种测试错误的方法,我更喜欢使用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