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
相关产品推荐
相关产品推荐

