Prueba Unitaria de Retrofit 2 api call con Mockito
Necesito algunos consejos sobre cómo burlarme de un api de descanso. Mi aplicación está en la arquitectura MVP.
Mi interfaz para API:
- ¿Cómo pasar el enum personalizado en @Query a través de Retrofit?
- Retrofit 2.0 lanzando "IllegalArgumentException: los parámetros @Field solo se pueden usar con la codificación de formularios". ¿Cómo hacer la consulta correcta de la API y arreglarlo?
- Retrofit 2 Se requiere la anotación del método HTTP (por ejemplo, @GET, @POST, etc.)
- ¿Cómo puedo manejar el cuerpo de respuesta vacío con Retrofit 2?
- Parámetro de reequipamiento
public interface MyAPI { @GET("{cmd}/{userName}/{password}") Observable<Response> login( @Path("cmd") String cmd, @Path("userName") String userName, @Path("password") String password );
Mi servicio:
public class MyService implements IService { private static MyService mInstance = new MyService(); private MyAPI mApi; public static MyService getInstance() { return mInstance; } private MyService() { OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder(); httpClientBuilder.connectTimeout(Config.DEFAULT_TIMEOUT, TimeUnit.SECONDS); Retrofit retrofit = new Retrofit.Builder() .baseUrl(Config.kBaseUrl) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(httpClientBuilder.build()) .build(); this.mApi = retrofit.create(MyAPI.class); } public void login( Subscriber<Response> subscriber, String userName, String password) { mApi.login(Config.kLoginCmd,userName,password) .subscribeOn(Schedulers.io()) .unsubscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(subscriber); }
Mi clase de presentador:
public class LoginPresenter implements LoginContract.Presenter { LoginContract.View mView; IService mService; ISession mSession; public LoginPresenter(LoginContract.View loginView, IService service, ISession session) { mView = loginView; mService = service; mSession = session; } @Override public void login(String email, String password) { Subscriber<Response> subscriber = new Subscriber<Response>() { @Override public void onCompleted() { mView.showLoading(false); } @Override public void onError(Throwable e) { mView.showError(e.getLocalizedMessage()); } @Override public void onNext(Response response) { if (response.getResults().getStatus().equalsIgnoreCase(Config.kResultCodeOK)) { mView.loginSuccess(); } else { mView.showError(response.getResults().getStatus().getErrmsg()); } } }; mView.showLoading(true); mService.login( subscriber, email, password); }
Hay otra manera de probar a mi presentador escribiendo un servicio de Mock. Pero no me gusta tanto y creo que Mockito podría ayudar.
Aquí está mi clase de prueba:
public class LoginPresenterMockTest { private LoginPresenter mLoginPresenter; @Mock LoginContract.View view; @Mock IService service; @Mock ISession session; @Before public void setup() throws Exception { MockitoAnnotations.initMocks(this); mLoginPresenter = new LoginPresenter(view, service, session); } @Test public void testLoginWithCorrectUserNameAndPassword() throws Exception { mLoginPresenter.login("[email protected]","password"); verify(view).loginSuccess(); } }
Lo que quiero hacer es imitar la llamada de datos de respuesta loginSuccess () cuando la respuesta es correcta.
Por supuesto, mi prueba actual no funcionará. ¿Necesito algunos consejos sobre cómo burlarme de esto? ¿Alguna idea? Gracias.
- Utilizar RxJava para encadenar la solicitud en un solo hilo
- Consiguió este error con retrofit2 y OkHttp3. No se puede resolver el host "<host-name>": ninguna dirección asociada con el nombre de host
- Retrofit2 enviar un método de solicitud PUT es incorrecto para PHP
- La llamada a la API de Retrofit recibe "HTTP FAILED: java.io.IOException: Cancelled"
- Cómo saber cuándo finaliza una llamada de Retrofit
- Cómo generar la biblioteca de cliente de Retrofit de wp resto api usando swagger
- % 3F en lugar de un signo de interrogación en mi URL de actualización
- Recvfrom falló: ECONNRESET (Conexión restablecida por pares)
Puedes hacerlo de la siguiente manera:
@Test public void testLoginWithCorrectUserNameAndPassword() throws Exception { // create or mock response object when(service.login(anyString(), anyString(), anyString).thenReturn(Observable.just(response)); mLoginPresenter.login("[email protected]","password"); verify(view).loginSuccess(); } @Test public void testLoginWithIncorrectUserNameAndPassword() throws Exception { // create or mock response object when(service.login(anyString(), anyString(), anyString).thenReturn(Observable.<Response>error(new IOException())); mLoginPresenter.login("[email protected]","password"); verify(view).showError(anyString); }
Gracias por @Ilya Tretyakov , he sacado esta solución:
private ArgumentCaptor<Subscriber<Response>> subscriberArgumentCaptor; @Test public void testLoginWithCorrectUserNameAndPassword() throws Exception { mLoginPresenter.login("[email protected]","password"); // create the mock Response object Response response = ...... verify(service, times(1)).login( subscriberArgumentCaptor.capture(), stringUserNameCaptor.capture(), stringPasswordCaptor.capture() ); subscriberArgumentCaptor.getValue().onNext(response); verify(view).loginSuccess(); }