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 10ist -> 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.