如何测试特定的异常是否未被抛出?

24

我能够测试特定的异常是否不会被抛出吗?

使用@Test[expect=MyException]很容易实现相反的功能。

但是我该如何否定这个测试呢?


这将测试异常是否被抛出。如果异常没有被抛出,它将失败。所以它已经做到了你想要的吗(?) - oers
1
你的标题(无论是修改前还是修改后)与你的问题文本相矛盾。你具体想做什么? - Dave Newton
抱歉,我的意思是如何测试特定的异常是否未被抛出。 - Acdc RocknRoll
可能是重复的问题:如何测试没有抛出异常? - Jeroen Vannevel
5个回答

22

如果您想测试在可能抛出其他异常的情况下,特定异常是否被抛出,请尝试以下方法:

try {
  myMethod();
}
catch (ExceptionNotToThrow entt){
  fail("WHOOPS! Threw ExceptionNotToThrow" + entt.toString);
}
catch (Throwable t){
  //do nothing since other exceptions are OK
}
assertTrue(somethingElse);
//done!

6
您可以使用assertj来执行以下操作:
如果您想检查异常是否未被抛出,则可以这样做。
Throwable throwable = catchThrowable(() -> sut.method());

assertThat(throwable).isNull();

或者您期望抛出异常

Throwable throwable = catchThrowable(() -> sut.method());

assertThat(throwable).isInstanceOf(ClassOfExecption.class)
                     .hasMessageContaining("expected message");

3

catch-exception 使 Freiheit 的示例更加简洁:

catchException(a).myMethod();
assertFalse(caughtException() instanceof ExceptionNotToThrow);

1

另一个最新的解决方案是使用 JUnit5 assertDoesNotThrow

assertDoesNotThrow( () -> myMethod() , "MyException is not thrown")

0

在编程中使用 @Test(expected = Test.None::class)(Kotlin语言)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接