Cómo crear un objeto retrofit.Response durante las pruebas de unidad con Retrofit 2

Mientras uso RxJava y Retrofit 2 estoy intentando crear pruebas de unidad para cubrir cuando mi aplicación recibe respuestas específicas.

El problema que tengo es que con Retrofit 2 no puedo ver una buena manera de crear un objeto retrofit.Response sin el uso de la reflexión.

@Test public void testLogin_throwsLoginBadRequestExceptionWhen403Error() { Request.Builder requestBuilder = new Request.Builder(); requestBuilder.get(); requestBuilder.url("http://localhost"); Response.Builder responseBuilder = new Response.Builder(); responseBuilder.code(403); responseBuilder.protocol(Protocol.HTTP_1_1); responseBuilder.body(ResponseBody.create(MediaType.parse("application/json"), "{\"key\":[\"somestuff\"]}")); responseBuilder.request(requestBuilder.build()); retrofit.Response<LoginResponse> aResponse = null; try { Constructor<retrofit.Response> constructor= (Constructor<retrofit.Response>) retrofit.Response.class.getDeclaredConstructors()[0]; constructor.setAccessible(true); aResponse = constructor.newInstance(responseBuilder.build(), null, null); } catch (Exception ex) { //reflection error } doReturn(Observable.just(aResponse)).when(mockLoginAPI).login(anyObject()); TestSubscriber testSubscriber = new TestSubscriber(); loginAPIService.login(loginRequest).subscribe(testSubscriber); Throwable resultError = (Throwable) testSubscriber.getOnErrorEvents().get(0); assertTrue(resultError instanceof LoginBadRequestException); } 

He intentado usar el siguiente pero esto crea una respuesta de OkHttp contra una respuesta de la mejora.

  Request.Builder requestBuilder = new Request.Builder(); requestBuilder.get(); requestBuilder.url("http://localhost"); Response.Builder responseBuilder = new Response.Builder(); responseBuilder.code(403); responseBuilder.protocol(Protocol.HTTP_1_1); 

La clase retrofit.Response tiene métodos estáticos de fábrica para crear instancias:

 public static <T> Response<T> success(T body) { /* ... */ } public static <T> Response<T> success(T body, com.squareup.okhttp.Response rawResponse) { /* ... */ } public static <T> Response<T> error(int code, ResponseBody body) { /* ... */ } public static <T> Response<T> error(ResponseBody body, com.squareup.okhttp.Response rawResponse) { /* ... */ } 

Por ejemplo:

 Account account = ...; retrofit.Response<Account> aResponse = retrofit.Response.success(account); 

O:

 retrofit.Response<Account> aResponse = retrofit.Response.error( 403, ResponseBody.create( MediaType.parse("application/json"), "{\"key\":[\"somestuff\"]}" ) ); 

Esto cae bajo Java efectivo 1: Considere métodos estáticos de fábrica en lugar de constructores .

  • Manejo de listas con RxJava y Retrofit en android
  • Robolectric + OkHttp + retrofit + prueba de unidad rxJava
  • ¿Debo cancelar la suscripción al utilizar rxbinding?
  • ¿Cómo crear un Observable en Android?
  • RxJava Break Chain en Condicional
  • ¿Por qué necesita onBackpressure () aquí para eventos de clic?
  • RxJava / RxAndroid - maneja varios cambios de EditText
  • RxAndroidBle mantener una conexión persistente + Manejo de escritura / notificación
  • Android + RxJava - carga de datos de db y servicio web
  • Schedulers.immediate () no funciona con las pruebas de gradle de la línea de comandos
  • Obtenga el valor actual de RxJava Observable
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.