java - Java 单元测试中的意外异常

标签 java unit-testing exception junit

我真的是 JUnit 和一般单元测试的新手,我正在努力寻找正确的方法。处理意外异常的更好方法是什么?为什么?

方法一:

  1. 先抓到预期的,测试失败并发消息
  2. 在最后一个 catch block 中,捕获一般异常并通过一些“发生意外异常”消息使测试失败

方法二:

  1. 只捕获预期的,失败并显示消息
  2. throws Exception 标记测试方法,让任何意外的“冒泡”完全脱离测试

更令人困惑的是,“意外异常”是指以下任一情况:

  1. 被测试方法声称抛出的异常,但在本例中是抛出。例如,我的方法抛出 IllegalArgumentException 和 NullPointerException,但在这个 try block 中,我希望它抛出 IllegalArgument; NullPointer 被认为是意外的。捕获并失败还是冒泡?
  2. 一个我真的无法预料的一般异常

我知道这个问题有点令人困惑,我自己也迷路了,但希望有人能给我任何提示。不会因为投反对票而责怪你,这仍然值得冒险:)

最佳答案

对于JUnit 的测试方法,基本上,如果该方法设法无错地结束,JUnit 就认为测试通过了。所以你应该做的是捕获所有应该到达的异常。在这种情况下,您可以执行以下操作:

@Test
public myMethodToTest()
{
    try {
        /* ... */
        /* error should trigger before the following statement : */
        fail("Reason");
    } catch(GoodException e) { } 
   // no need to do anything since you expected that error
   // You can let the test ends without further statement 
}

There is another写法:

@Test (expected=IndexOutOfBoundsException.class)
public void elementAt()
{
    int[] intArray = new int[10];

    int i = intArray[20]; // Should throw IndexOutOfBoundsException
}

如果你仍然想要,你仍然可以捕获不应该触发的异常,然后做类似的事情:

@Test
public myMethodToTest()
{
    try {
        /* ... */
    } catch(BadException e) {
        fail("Reason");
    }

}

关于java - Java 单元测试中的意外异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16508142/

相关文章:

java - 如何在 Delphi 对象或字符串中隐式使用 ToString()?

unit-testing - 行为与基于状态的测试

python - 应该如何记录单元测试?

angular - fakeAsync() 测试助手需要错误 : zone-testing. js,但找不到。使用 serenityJS+Jasmine 在 Angular webapp 上运行测试时

python - 使用python elasticsearch创建索引时如何处理try catch异常?

java.security.KeyStore 仅显示 p12 文件中两个证书之一

java - 将 json 数组转换为 json(raw) 字符串列表

java - 用于反转字符串的 Lambda 表达式 - Java

java - 同时抛出两个异常

用于引起/包装异常的 Spring ExceptionHandler