2017-03-13 5 views
0

Ich versuche MVP Muster mit TDD.Komponententest mit Mockito- Make Mock von Abstract, leere Methode

Ich habe folgende Vertrag für Model, View und Moderator

Contract Klasse

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); 
    } 
} 

ich Unit-Test versuche die Moderator Logik wie folgt aus:

Testklasse

@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); 
    } 
} 

Mein MockView/VIEW Klasse sieht wie folgt aus:

Dies ist -> Mock Klasse

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

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

Meine VORFÜHRER Umsetzung des Auftrags ist wie diese.

Diese 10

ist -> Echt Klasse

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); 
       }  
    } 


    } 

ich die MODEL Klasse Implementierung wie dieses:

Dies ist -> Echt Klasse

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"); 
     } 
    } 
} 

nun die reale Problemteil:

Ich war erfolgreich in der Lage, den Moderator mit dem Mock von GithubContract.Model selbst zu testen, aber ich möchte Mockito verwenden, um das Modell zu verspotten, aber wie meine getUsersAndPromptPresenter() Methode ist abstrakt, gibt void zurück, nimmt Parameter und ruft zurück zum Referenten aus eine innere Klasse innerhalb der Methode.

Wie kann ich mein Modell verspotten? Wenn ich Änderungen in der Architektur mitbringen muss, um sie testbar zu machen, dann schlagen Sie sie bitte vor.

Antwort

2

Sie sollten Presenter nicht an Model übergeben, Model und Presenter sollten nicht eng gekoppelt sein, da Modelklassen nicht wiederverwendet werden können. Stattdessen bieten Sie erfolgreiche und Fehlerrückrufe (oder ein zusammengesetztes Objekt, das diese beiden Rückrufe enthält). Und dann werden Sie in der Lage sein, diesen Rückruf mit Mockito zu erfassen und den gewünschten Anruf zu tätigen. Auch heute ist es sehr üblich, RxJava zu verwenden, es macht es leichter, Modellklassen zu verspotten.
Und hier ist eine allgemeine gute Praxis: Sie sollten vermeiden, And/Oder-Wörter in Methodennamen zu verwenden, weil es anzeigt, dass die Methode mehr als eine Sache tut, die schlecht ist