模拟改造错误okhttp3.ResponseBody$1无法转换

问题描述 投票:0回答:2

我正在尝试测试使用改造的代码片段,因此我创建了一个接口来“模拟”返回,它部分工作,它可以调用入队的onresponse,但它无法转换

Response <AuthResponse> response 
,出现以下错误:

java.lang.ClassCastException:okhttp3.ResponseBody$1 无法转换为 br.com.safety.safetyrecognitionsdk.data.network.auth.AuthResponse

模拟接口

public interface AuthRepositoryBoundary {

    Call<AuthResponse> auth(String appKey, String projectId);

}

班级被嘲笑

public class AuthSuccessTest implements AuthRepositoryBoundary {

    @Override
    public Call<AuthResponse> auth(String appKey, String projectId) {

        ResponseBody body = ResponseBody.create(
                MediaType.parse("application/json"),
                MockAuth.AUTH_SUCCESS
        );

        Response aResponse = Response.success(body, new okhttp3.Response.Builder() //
                .code(201)
                .message("OK")
                .body(body)
                .protocol(Protocol.HTTP_1_1)
                .request(new Request.Builder().url("http://localhost/").build())
                .build());

        return Calls.response(aResponse);
    }

}

实施

@Override
public void auth(String appKey, String projectID) {
     this.authRepository.auth(appKey, projectID).enqueue(new Callback<AuthResponse>() {
          @Override
          public void onResponse(Call<AuthResponse> call, Response<AuthResponse> response) {
              switch (response.code()) {
                  case 201:
                      authListener.onSuccess(response.body());
                      break;
                  case 401:
                      authListener.onUnauthorized("Unauthorized");
                      break;
                  default:
                      authListener.onError("Server error");
                      break;
              }
         }

          @Override
          public void onFailure(Call<AuthResponse> call, Throwable t) {
              authListener.onError(t.getMessage());
            }
        });
    }

测试:

@Test
public void when_success_authentication_should_be_invoke_on_success() {
    this.authListenerMock = mock(AuthListener.class);
    this.authRepositoryMock = mock(AuthRepositoryBoundary.class);

    this.authSuccessTest = new AuthSuccessTest();

    this.safetyRecognition = new SafetyRecognition()
                .setCredentials("project_id", "key_id")
                .auth(new Authentication(this.authListenerMock, this.authSuccessTest));

    verify(this.authListenerMock).onSuccess(ArgumentMatchers.any(AuthResponse.class));
}
android unit-testing testing retrofit retrofit2
2个回答
0
投票

应该是吗

public interface AuthRepositoryBoundary {
Call<Response<AuthResponse>> auth(String appKey, String projectId);
}

然后:

public class AuthSuccessTest implements AuthRepositoryBoundary {

@Override
public Call<Response<AuthResponse>> auth(String appKey, String projectId) {

    ResponseBody body = ResponseBody.create(
            MediaType.parse("application/json"),
            MockAuth.AUTH_SUCCESS
    );

    Response aResponse = Response.success(body, new okhttp3.Response.Builder() //
            .code(201)
            .message("OK")
            .body(body)
            .protocol(Protocol.HTTP_1_1)
            .request(new Request.Builder().url("http://localhost/").build())
            .build());

    return Calls.response(aResponse);
}}


0
投票

这个解决方案

 @Override
 public Call<AuthResponse> auth(String appKey, String projectId) {
    ResponseBody body = ResponseBody.create(MediaType.parse("application/json"), JsonMockAuth.AUTH_SUCCESS);

    AuthResponse authResponse = new AuthResponse();
    authResponse.setxToken("tokinho");

    Response<AuthResponse> aResponse = Response.success(authResponse, new okhttp3.Response.Builder()
            .code(201)
            .message("OK")
            .protocol(Protocol.HTTP_1_1)
            .request(new Reqest.Builder().url("http://localhost/").build())
            .build());
    return Calls.response(aResponse);
}
© www.soinside.com 2019 - 2024. All rights reserved.