You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mockito JUnit测试中抛出受检异常时应如何进行断言验证

问题根因

你遇到的报错是两个错误共同导致的:

  • assertThrows 方法的第二个入参需要传入会触发目标异常的待测试执行逻辑,你仅在lambda中写了Mockito打桩代码,没有实际调用httpClient.execute()方法,自然不会抛出IOException。
  • Mockito打桩的参数匹配规则不匹配:你定义的触发条件是入参为HttpPost类型时抛出异常,但实际调用时传入的是HttpUriRequest类型的mock对象,匹配失败导致打桩不生效,不会触发异常。
正确实现方案

通用场景(任意HttpUriRequest子类入参都抛异常)

完整测试代码如下:

import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest;
import org.junit.Test;
import static org.junit.Assert.assertThrows;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.IOException;
import com.google.common.truth.Truth;

@Test
public void throwIOExceptionOnHttpRequest() {
    // 初始化mock对象
    HttpClient httpClient = mock(HttpClient.class);
    HttpUriRequest httpUriRequest = mock(HttpUriRequest.class);

    // 提前完成Mockito打桩
    when(httpClient.execute(any(HttpUriRequest.class))).thenThrow(IOException.class);

    // 将实际调用execute的逻辑放入assertThrows的lambda中
    IOException thrown = assertThrows(
        IOException.class,
        () -> httpClient.execute(httpUriRequest)
    );

    // 异常属性断言可按需扩展
    Truth.assertThat(thrown).isInstanceOf(IOException.class);
}

限定HttpPost类型入参的场景

如果你的测试逻辑要求仅当入参为HttpPost类型时才抛出异常,只需修改mock对象的声明即可,其余逻辑保持不变:

// 把原来的HttpUriRequest mock改为HttpPost类型
HttpUriRequest httpUriRequest = mock(HttpPost.class);

内容的提问来源于stack exchange,提问作者SudhirKumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:24:00