powermockito - 测试异常处理

时间:2016-01-29 17:01:49

标签: java powermockito

测试剪辑:

void somefunction() {
  try {
    aMock.doSomething();
    bMock.another();
  } finally {
    cMock.cleanup();
  }
}

测试:

@Test(expected = Exception.class)
void sometest() {
  ... setup various mocks ...

  PowerMockito.doThrow(new Exception("abc")).when(aMock).doSomething();

  outerMock.somefunction();

  // ** THIS SHOULD FAIL
  verify(bMock).another();

  // ** THIS SHOULD FAIL TOO
  verify(cMock, never()).cleanup()
}

当我跑步时它会过去。为什么?抛出异常(以及@Test中的处理)是否胜过验证语句?

如果是这样 - 是否有某种方法可以测试 finally 子句是否已执行?

1 个答案:

答案 0 :(得分:2)

因为抛出异常(真实的),功能代码下的所有内容都是死代码。

outerMock.somefunction();  // throw so, this is the end

// ------- dead code blow:
// ** THIS SHOULD FAIL
verify(bMock).another();

// ** THIS SHOULD FAIL TOO
verify(cMock, never()).cleanup()

因此,要测试finally块,必须使用正常执行(当没有异常发生时)。另一个解决方案是在测试中使用try / catch:

try {
    outerMock.somefunction();
    fail("was expecting an exception..");
} catch(Exception exception) {
    // ignore
}

verify(bMock).another();
verify(cMock, never()).cleanup()

回答评论中的问题:

现在假设代码:

void somefunction() {
    try {
        aMock.doSomething();
        bMock.another();
    } catch(Exception ex) {
        cMock.handleException(ex);
    }
}

测试可能是:

Exception testEx = new Exception("testing")
Mockito.when(aMock.doSomething()).thenThrow(testEx);
instance.somefunction();
Mockito.verify(cMock).handleException(testEx);