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.
- RxJavaCallAdapterFactory no se puede convertir en Factory
- Compartiendo RxBindings Eventos observables entre múltiples suscriptores
- RxAndroid filter Observable <List <Item >>
- Obtención perezosa de objetos paginados usando RxJava
- Flatten Observable <Observable <Cursor >> Observable <Cursor>
@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);
- Uso de Mockito con Retrofit 2.0
- Robolectric Test no llama a textWatcher.onTextChanged
- RxJava + retrofit, obtenga una lista y agregue información adicional para cada artículo
- Dar un RxJava Observable algo a emitir de otro método
- No se puede convertir el objeto Subclase en cuerpo de solicitud json en Retrofit 2.0 con GsonConverterFactory
- Retrofit / Rxjava y servicios basados en sesiones
- Cómo encadenar los métodos groupBy () de RxJava como groupBy (). GroupBy ()
- RxJava HashMap Transformación
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 .
- IllegalArgumentException: Error al encontrar la raíz de configuración que contiene xxx en FileProvider.getUriForFile
- La clase de aplicación de Android se llama dos veces