2017-09-12 5 views
0

J'essaie de tester une API retrofit2 en utilisant MockRetrofit. J'ai l'API de service suivant:Impossible de tester les appels API Async Retrofit2 en utilisant MockRetrofit

interface AuthApi 
    { 
     public Call<Result> signin(String username, String pswd); 
    } 

La mise en œuvre Mock ressemble à ceci:

public class MockAuthService implements AuthApi 
    { 
     BehaviorDelegate<AuthService> delegate; 
     public MockAuthService(BehaviorDelegate<AuthService> d) 
     { 
      delegate = d; 
     } 

     public Call<Result> signin(String username, String pswd) 
     { 
      return delegate.returningResponse(new Result()).signin(usernam, pswd); 

     } 
    } 

Mon test se présente comme suit:

@Test 
public void testSuccessfulLogin() 
{ 
    // Create MockRetrofit object 

    MockAuthService service = new MockAuthService(mockRetrofit.create(AuthService.class)); 
    Call<Result> call = service.signin("user", "pswd"); 
    call.execute(); //This works fine. I get the result obj and check status code and stuff 
    call.enqueue(new Callback<Result>() // This does not work 
    { 
     @Override 
     public void onResponse(Call<Result> call, Response<SignInResult.Result> response) 
     { 
      System.out.println("onResponse"); // This is never called 
     } 

     @Override 
     public void onFailure(Call<Result> call, Throwable throwable) 
     { 
      System.out.println("onFailure"); // this is never called 
     } 
    }); 
} 

La partie async (de call.enqueue ()) du test unitaire ne fonctionne pas. Les rappels (onResponse ou onFailure) ne sont jamais appelés. Les appels de synchronisation fonctionnent correctement. Toutes les idées pour lesquelles seuls les appels asynchrones ne fonctionnent pas.

+0

Le problème était que je n'attendais pas que le thread d'arrière-plan appelle les méthodes de rappel. Une fois que j'ai mis un Thread.sleep (1000) après que la mise en file d'attente a été appelée, il a commencé à fonctionner correctement. – araju

Répondre

0

Le problème était que je n'attendais pas que le thread d'arrière-plan appelle les méthodes de rappel. Une fois que j'ai mis un Thread.sleep (1000) après que la mise en file d'attente a été appelée, il a commencé à fonctionner correctement.