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);
}
答案 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
,它适合您的方法声明。