我将尝试提供一个朴实无味的示例,以很好地减少该问题:-)

我有一个GenericException和一个扩展了MoreSpecificExceptionGenericException

我需要测试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。如果它抛出MoreSpecificExceptionGenericException的任何其他子类,我希望测试失败。

阅读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相同。

源代码
  • https://gist.github.com/mariuszs/7489706

  • 依存关系
    org.assertj:assertj-core:1.4.0
    com.googlecode.catch-exception:catch-exception:1.2.0
    

    10-06 10:45