mockito 可以抛出一般异常

Mockito 可以扔将军Exception吗?


当我这样做时,测试失败并显示“org.mockito.exceptions.base.MockitoException: Checked Exception is invalid for this method”


这是我的 @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);

}


慕尼黑的夜晚无繁华
浏览 1014回答 3
3回答

慕田峪4524236

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

RISEBY

您可以使用自定义Answer实现引发已检查的异常:Mockito.doAnswer(new Answer<Object>() {&nbsp; &nbsp; @Override&nbsp; &nbsp; public Object answer(InvocationOnMock invocation) throws Throwable {&nbsp; &nbsp; &nbsp; &nbsp; throw new Exception();&nbsp; &nbsp; }}).when(service).getHTTPResponse("http://" + HOST + "/health");类型参数Object可能需要更改为任何结果service.getHTTPResponse。

慕哥9229398

Mockito 尽最大努力确保传递的参数、返回的类型和抛出的异常的类型安全和一致性。如果 Mockito 在编译时或运行时“停止”您,在大多数情况下这是正确的,您不必尝试绕过它,而是了解问题根源并纠正它。实际上,您的实际要求是 XY 问题。在 Java 中,检查已检查的异常。这意味着它必须被声明为由方法抛出。如果您的getHTTPResponse()方法未在其声明中声明throw Exception(或其父类Throwable),则意味着永远不会通过调用在运行时抛出异常,因此您的单元测试没有意义:您模拟了一个不可能的场景。我认为,你想要的是扔RuntimeException在&nbsp;getHTTPResponse()如:when(service.getHTTPResponse("http://"&nbsp;+&nbsp;HOST&nbsp;+&nbsp;"/health")).thenThrow(RuntimeException.class);ARuntimeException不需要声明,这适合您的方法声明。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java