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'
注:设置
testscope仅影响测试环境,不会污染主代码依赖。
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 { // 测试方法实现 }
验证步骤
- 按照上述方案调整依赖或代码
- 重新运行单元测试,检查是否仍存在原错误
- 确认toResponse方法返回的状态码符合预期逻辑
内容的提问来源于stack exchange,提问作者Peter Potoma
相关产品推荐
相关产品推荐

