Retrofit模拟测试类型转换异常:ResponseBody无法转为AuthResponse
解决Retrofit中Response的ClassCastException问题
这个ClassCastException是典型的Retrofit未正确将响应体解析为目标实体类的问题,我帮你拆解下可能的原因和解决办法:
1. 检查Retrofit实例是否配置了ConverterFactory
Retrofit需要依赖Converter来把HTTP响应的ResponseBody转换成你定义的Java对象(比如AuthResponse),如果没添加对应的Converter,它会默认返回ResponseBody实例,这时强转成AuthResponse必然抛出类型转换异常。
确保你的Retrofit构建代码里添加了JSON解析的Converter(以常用的Gson为例):
Retrofit retrofit = new Retrofit.Builder() .baseUrl("你的基础URL") .addConverterFactory(GsonConverterFactory.create()) // 这一行必须存在! .build();
2. 修正模拟接口的返回内容
你提到是用模拟接口测试,分两种常见场景处理:
如果你用MockWebServer模拟请求
要确保返回的是符合AuthResponse结构的JSON字符串,并且设置正确的Content-Type响应头,告诉Retrofit这是JSON数据:
MockWebServer mockWebServer = new MockWebServer(); // 模拟返回AuthResponse对应的JSON结构 mockWebServer.enqueue(new MockResponse() .setBody("{\"token\":\"mock_token\", \"userId\":1001}") // 替换为你的实体类对应字段 .setHeader("Content-Type", "application/json"));
如果你用Mockito直接模拟AuthRepositoryBoundary接口
不要返回ResponseBody实例,而是直接返回封装好的AuthResponse对象:
// 错误示例:返回ResponseBody会导致类型转换异常 // when(authRepositoryBoundary.auth(anyString(), ...)).thenReturn(Call.success(ResponseBody.create(...))); // 正确示例:返回AuthResponse实例 AuthResponse mockAuthResponse = new AuthResponse("mock_token", 1001); when(authRepositoryBoundary.auth(anyString(), ...)) .thenReturn(Call.success(mockAuthResponse));
3. 确认AuthResponse实体类的序列化配置
确保你的AuthResponse类符合JSON解析库的要求(以Gson为例):
- 有无参构造函数(Gson默认需要)
- 用
@SerializedName注解映射JSON字段和类属性(如果字段命名风格不一致的话)
示例:
public class AuthResponse { @SerializedName("token") private String token; @SerializedName("user_id") // 适配JSON下划线命名与类驼峰属性的映射 private int userId; // 无参构造函数 public AuthResponse() {} // 带参构造函数 public AuthResponse(String token, int userId) { this.token = token; this.userId = userId; } // Getter和Setter方法 public String getToken() { return token; } public void setToken(String token) { this.token = token; } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } }
总结
这个问题的核心是Retrofit没有拿到能解析成AuthResponse的有效响应内容——要么是缺少Converter导致无法完成解析,要么是模拟返回的内容不是正确的AuthResponse实例/JSON结构。按照上面的步骤排查,应该就能解决问题啦。
内容的提问来源于stack exchange,提问作者Jose Vieira Neto
相关产品推荐
相关产品推荐

