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

Mockito无法mock javax.ws.rs.core.Response及空指针问题求助

解决Mockito无法mock javax.ws.rs.core.Response的问题

问题根源

javax.ws.rs.core.Response作为JAX-RS的核心类,内部实现依赖javax.xml.bind.annotation.adapters.XmlAdapter,但你的项目中缺失该类,导致Mockito通过ByteBuddy生成代理类时失败——要么抛出"Mockito cannot mock this class"错误,要么未添加@ExtendWith(MockitoExtension.class)时触发空指针异常。

无需额外安装代理的解决办法

1. 补充JAXB API依赖

直接在项目构建文件中添加JAXB API的测试依赖,补全缺失的类:

Maven

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
    <scope>test</scope>
</dependency>

Gradle

testImplementation 'javax.xml.bind:jaxb-api:2.3.1'

注:设置test scope仅影响测试环境,不会污染主代码依赖。

2. 绕开mock,直接构造Response实例

不想新增依赖的话,直接创建真实的Response对象,或用Mockito的spy包装真实实例:

直接构造实例

// 按测试需求构造对应状态码的Response
Response testResponse = Response.status(Response.Status.BAD_REQUEST).build();

使用Mockito spy

// 先构造真实实例,再通过spy按需stub方法
Response realResponse = Response.ok().build();
Response spiedResponse = Mockito.spy(realResponse);
// 示例:stub状态码返回值
Mockito.when(spiedResponse.getStatus()).thenReturn(400);

3. 调整ByteBuddy版本适配Mockito

你当前使用的Mockito 4.8.0默认依赖ByteBuddy 1.12.18,而项目中是1.12.9,版本差异可能导致代理生成失败,调整ByteBuddy到对应版本即可:

Maven调整ByteBuddy版本

<dependency>
    <groupId>net.bytebuddy</groupId>
    <artifactId>byte-buddy</artifactId>
    <version>1.12.18</version>
    <scope>test</scope>
</dependency>

4. 确保正确使用MockitoExtension

测试类必须添加@ExtendWith(MockitoExtension.class),否则Mockito无法初始化上下文,必然触发空指针异常:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
public class YourExceptionMapperTest {
    // 测试方法实现
}

验证步骤

  1. 按照上述方案调整依赖或代码
  2. 重新运行单元测试,检查是否仍存在原错误
  3. 确认toResponse方法返回的状态码符合预期逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:17:17