Mock Retrofit错误okhttp3.ResponseBody $ 1无法投射

时间:2018-04-30 14:57:42

标签: android unit-testing testing retrofit retrofit2

我正在尝试测试使用改造的代码片段,因此我创建了一个界面来模拟&#34;模拟&#34;返回,它在部分工作,它可以调用enqueue的响应,但它无法转换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));
}

2 个答案:

答案 0 :(得分: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);
}}

答案 1 :(得分: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);
}