我将尝试提供一个朴实无味的示例,以很好地减少该问题:-)
我有一个GenericException
和一个扩展了MoreSpecificException
的GenericException
。
我需要测试SomeService.doThis()
抛出MoreSpecificException
。 JUnit让我可以像这样优雅地做到这一点。
@Test(expected = MoreSpecificException.class)
public void testDoThis() throws GenericException {
new SomeService().doThis();
}
但是,我还需要测试
SomeService.doThat()
抛出GenericException
,所以我尝试了这一点。@Test(expected = GenericException.class)
public void testDoThat() throws GenericException {
new SomeService().doThat();
}
但是,我发现如果
doThat()
实际上抛出了MoreSpecificException
,那么第二项测试仍然可以通过。我认为这是因为MoreSpecificException
是 GenericException
,并且注释的实现是为了尊重这种关系。尽管这是明智的默认行为,但我不希望这样做。我想测试
doThat()
抛出GenericException
和仅GenericException
。如果它抛出MoreSpecificException
或GenericException
的任何其他子类,我希望测试失败。阅读docs似乎无法对注释执行任何操作来更改此行为,因此看起来我将不得不使用其他解决方案。
目前,我正在采用以下丑陋的解决方案-内森·休斯(Nathan Hughes)的回答使编辑变得不那么丑陋:-)
@Test
public void testDoThat() {
try {
new SomeService().doThat();
Assert.fail();
} catch(GenericException ex) {
Assert.assertEquals(GenericException.class, ex.getClass());
}
}
在JUnit框架中是否有更优雅的方法来实现我想要的功能?
最佳答案
BDD样式解决方案
JUnit 4 + Catch Exception + AssertJ
最优雅的解决方案;)可读,无需样板代码。
@Test
public void testDoThat() {
when(new SomeService()).doThat();
then(caughtException()).isExactlyInstanceOf(GenericException.class);
}
该代码与FEST Assertions 2 + Catch-Exceptions相同。
源代码
依存关系
org.assertj:assertj-core:1.4.0
com.googlecode.catch-exception:catch-exception:1.2.0