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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:47:29