2017-03-13 3 views
0

J'essaie MVP modèle avec TDD.Test de l'unité en utilisant Mockito- Make maquette de la méthode Résumé, vide

Je le contrat suivant pour Modèle, Vue et présentateur

Classe contrat

interface GithubContract { 
    interface View { 
     void displayUsers(List<GurkhaComboDTO> userList); 
    } 

    interface Model { 
     void getUsersAndPromptPresenter(String userName, Presenter presenter); 

    } 

    interface Presenter { 

     void searchUsers(String userName); 

     void loadUsers(List<GithubUserDTO> userList); 
    } 
} 

Je suis en train de test unitaire du présentateur logique comme ceci:

Classe de test

@RunWith(MockitoJUnitRunner.class) 
public class GithubPresenterWithMockitoTest { 

    @Mock 
    GithubContract.Model mockedModel; 

    @Test 
    public void shouldDisplayUsersToScreen() { 
     //given 
     final GithubContract.View view = new MockView(); // I have created the mock myself for the view this time. 
     final GithubContract.Presenter presenter = new GithubPresenter(view, mockedModel); 
     *********************************************************** 
     // I do not know what to write here 
     **************************************************** 
     presenter.searchUsers(""); 
     Assert.assertEquals(true, ((MockView) (view)).enoughItems); 
    } 
} 

Mon MockView/VIEW classe ressemble à ceci:

C'est -> classe Mock

class MockView implements GithubContract.View { 
     boolean enoughItems = false; 

     @Override 
     public void displayUsers(List<GurkhaComboDTO> userList) { 
      enoughItems = true; 
     } 
} 

Mon PRESENTER mise en œuvre du contrat est comme celui-ci.

Ceci est -> A classe

class GithubPresenter implements GithubContract.Presenter { 

      private GithubContract.View view; 
      private GithubContract.Model model; 

     GithubPresenter(GithubContract.View view, GithubContract.Model model) { 

       this.view = view; 
       this.model = model; 
      } 

     @Override 
     public void searchUsers(String userName) { 
      model.getUsersAndPromptPresenter(userName, this); 
     } 

     @Override 
     public void loadUsers(List<GithubUserDTO> data) { 

      if (data != null) { 
       if (!data.isEmpty()) { 
        view.displayUsers(users); 
       }  
    } 


    } 

Je le MODEL classe mise en œuvre comme ceci:

Ceci est -> Classe réel

public class GithubModel implements Model { 

    @Inject 
    GithubAPIService apiService; 
    private Call<GithubUserListDTO> userListCall; 

    private Context context; 

    GithubModel(Context context) { 
     this.context = context; 
     apiService = Util.getAPIService(); // I am using dagger, retrofit and okhttp3 with GSON to get Objects directly from network call 

    } 

    @Override 
    public void getUsersAndPromptPresenter(final String userName, final GithubContract.Presenter presenter) { 
     userListCall = apiService.searchGitHubUsers(userName); 
     if(Util.isInternetConnected(context)) { 
      userListCall.enqueue(new Callback<GithubUserListDTO>() { 
       @Override 
       public void onResponse(Call<GithubUserListDTO> call, Response<GithubUserListDTO> response) { 

        try { 
         presenter.loadUsers(response.body().getList()); 
        } catch (Exception ignored) { 
         Util.log(ignored.getMessage()); 

        } 

       } 

       @Override 
       public void onFailure(Call<GithubUserListDTO> call, Throwable t) { 

       } 
      }); 
     }else { 
Util.log("No Internet"); 
     } 
    } 
} 

Maintenant, le vrai partie du problème:

J'ai réussi à tester le présentateur avec le simulacre de GithubContract.Model moi-même, mais je veux utiliser Mockito pour simuler le modèle mais comme ma méthode getUsersAndPromptPresenter() est abstraite, renvoie void, prend les paramètres et les appels au présentateur de une classe interne à l'intérieur de la méthode.

Comment puis-je simuler mon modèle? Si je dois apporter un changement dans l'architecture afin de pouvoir la tester, alors suggérez-la.

Répondre

2

Vous ne devez pas passer le présentateur à Model, Model et Presenter ne doit pas être étroitement couplé car il empêche les classes de modèles d'être réutilisables. Au lieu de cela, fournissez des rappels réussis et des erreurs (ou un objet composite qui contient ces deux callbacks). Et puis vous serez en mesure de capturer ce rappel avec mockito et appelez le requis. De plus, il est très courant aujourd'hui d'utiliser RxJava, il est donc plus facile de se moquer des classes Model.
Et voici une bonne pratique générale: vous devriez éviter d'utiliser les mots Et/Ou dans les noms de méthode car cela indique que la méthode fait plus d'une chose qui est mauvaise