为了账号安全,请及时绑定邮箱和手机立即绑定

mockito 可以抛出一般异常

mockito 可以抛出一般异常

慕尼黑的夜晚无繁华 2021-07-03 09:00:55
Mockito 可以扔将军Exception吗?当我这样做时,测试失败并显示“org.mockito.exceptions.base.MockitoException: Checked Exception is invalid for this method”这是我的 @Testpublic 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 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

使用 lambda 函数:


Mockito.doAnswer(i -> { throw new Exception(); })

    .when(service)

    .getHTTPResponse("http://" + HOST + "/health");


查看完整回答
反对 回复 2021-07-14
?
RISEBY

TA贡献1856条经验 获得超5个赞

您可以使用自定义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。


查看完整回答
反对 回复 2021-07-14
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

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

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

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

ARuntimeException不需要声明,这适合您的方法声明。


查看完整回答
反对 回复 2021-07-14
  • 3 回答
  • 0 关注
  • 1012 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信