可以嘲弄一般异常

时间:2018-08-10 18:03:19

标签: java exception mockito

Mockito可以扔掉一般的Exception吗?

当我这样做时,测试失败,并显示“ org.mockito.exceptions.base.MockitoException:此方法的检查异常无效”

这是我的@Test

public void testServiceSomeError() throws ClientProtocolException, IOException {
    //Arrange    
    HealthService service = Mockito.mock(HealthService.class);

    when(service.executeX(HOST)).thenCallRealMethod();
    when(service.getHTTPResponse("http://" + HOST + "/health")).thenThrow(Exception.class);
    //Act
    String actual = service.executeX(HOST);

    //Assert
    assertEquals(ERROR, actual);
}

3 个答案:

答案 0 :(得分:1)

您可以使用自定义Answer实现来引发已检查的异常:

Mockito.doAnswer(new Answer<Object>() {
    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable {
        throw new Exception();
    }
})
.when(service)
.getHTTPResponse("http://" + HOST + "/health");

类型参数Object可能需要更改为service.getHTTPResponse的结果。

答案 1 :(得分:1)

如@ernest_k所建议,但具有lambda函数:

Mockito.doAnswer(i -> { throw new Exception(); })
    .when(service)
    .getHTTPResponse("http://" + HOST + "/health");

答案 2 :(得分:1)

Mockito尽最大努力确保传递的参数,返回的类型和引发的异常中的类型安全性和一致性。
如果Mockito在编译时或运行时“停止”您,则在大多数情况下是正确的,您不必尝试绕过它,而是了解问题根源并进行更正。

实际上,您的实际要求是XY问题。
在Java中,将检查已检查的异常。这意味着必须声明要由方法抛出。
如果您的getHTTPResponse()方法未在其声明中声明throw Exception(或其父类Throwable),则意味着永远不会在运行时通过调用引发异常,因此您的单元测试没有意义:您模拟不可能的情况。
我认为您要在RuntimeException中投掷getHTTPResponse(),例如:

when(service.getHTTPResponse("http://" + HOST + "/health")).thenThrow(RuntimeException.class);

不需要声明RuntimeException,它适合您的方法声明。