Тестирование приложения MVP для Android с Mockito - PullRequest
0 голосов

Я пытаюсь провести какой-то юнит-тест на базовом приложении для Android.он просто выполняет вход в какой-либо WS с помощью модернизации, мое приложение имеет шаблон MVP.

Что я делаю?

вызов уровня презентатора, это вызовет интерактора, а здесь я вызовумой сервис

    @Override
    public void doLogin(String user, String pwd, final LoginListener loginListener) {

        try {
            final LoginRequest request = new LoginRequest();
            request.setEmpleado(user);
            request.setPwd(pwd);

            Callback<LoginResponse> callback = new Callback<LoginResponse>() {
                @Override
                public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
                    if(response != null && response.isSuccessful() && response.body() != null) {
                        if("00".equals(response.body().getCodigo())) {
                            loginListener.authOK();
                        } else {
                            loginListener.showError();
                        }
                    } else {
                        loginListener.showError();
                    }
                }

                @Override
                public void onFailure(Call<LoginResponse> call, Throwable t) {
"+t.getMessage()+" "+t.getCause());
                    if(t instanceof SocketTimeoutException) {
                        loginListener.showError();
                    } else {
                        loginListener.showError();
                    }
                }
            };

            WSLogin wsLogin = RetrofitClient.getInstance().getRetrofit().create(WSLogin.class);
            wsLogin.autenticar(request).enqueue(callback);

        } catch (Exception e) {
            loginListener.showError();
            e.printStackTrace();
        }

Мой сервис называется, но я никогда не получаю обратный вызов

Тест

package com.arleckk.loginmvpci.login;


import com.arleckk.loginmvpci.login.presenter.LoginListener;
import com.arleckk.loginmvpci.login.presenter.LoginPresenter;
import com.arleckk.loginmvpci.login.presenter.LoginPresenterImpl;
import com.arleckk.loginmvpci.login.view.LoginView;
import com.arleckk.loginmvpci.model.LoginResponse;
import com.arleckk.loginmvpci.network.WSLogin;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.modules.junit4.PowerMockRunner;

import java.io.IOException;

import retrofit2.Call;
import retrofit2.Response;

import static org.junit.Assert.assertEquals;

@RunWith(PowerMockRunner.class)
@PowerMockIgnore("javax.net.ssl.*")
public class LoginTest {

    @Mock private LoginView loginView;
    @Mock private LoginPresenter loginPresenter;
    @Mock private LoginListener loginListener;
    @Mock private Call<LoginResponse> loginResponseCall;
    Response<LoginResponse> loginResponseResponse;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        loginPresenter = new LoginPresenterImpl(loginView);
    }

    @Test
    public void testOK() throws IOException {
        loginPresenter.doLogin("TEST", "TEST1234");
    }


}

Другой вопрос: действительно ли я делаю юнит-тест?Я имею в виду модульное тестирование только для проверки «модуля» кода.

Я ожидаю объект LoginResponse, а затем сравниваю его, и если он равен «00», то он успешен

1 Ответ

2 голосов
/ 12 мая 2019

Нет, вы не.По нескольким причинам.Во-первых, у вас нет теста здесь.У вас нет ни одного утверждения.Независимо от того, что произойдет, твой код скажет passТак что это не тест.Тест будет заключаться в том, чтобы вызвать doLogin с рабочим логином и убедиться, что loginListener.authOK () вызван.Затем вызывается другой тест, который использует неверный пароль и проверяет, что showError.Без этого все, что у вас есть, - пустая трата времени.

Второе - это ужасно ограничено для юнит-теста.Для модульного теста вы должны проверить, работает ли наименьшая единица кода.Здесь вы проверяете, что весь сетевой стек и ваш сервер работают.Это слишком много.И модульное тестирование никогда не должно зависеть от работы внешнего сервера, это просто приведет к нестабильному тесту - нечто подобное должно быть в комплекте интеграции.

Ваш код сейчас не оптимизирован для тестирования.Если бы это было - вы бы не создавали модифицированный клиент с помощью синглтона в коде.Вы бы передали это в DoLogin.Таким образом, вы можете пройти макет в тесте, который может вернуть ложный ответ, а затем проверить, может ли ваш код правильно идентифицировать ложный успех и неудачный ответ, удалив зависимость от сервера и протестировав все функции.

...