【问题标题】:Testing an MVP Android Application with Mockito使用 Mockito 测试 MVP Android 应用程序
【发布时间】:2019-05-12 01:09:38
【问题描述】:

我正在尝试对一个基本的 Android 应用程序进行一些单元测试。它只是使用改造我的应用程序有一个 MVP 模式登录到一些 WS。

我在做什么?

调用演示者层,这将调用交互器,在这里我将调用我的服务

    @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”,那就成功了

【问题讨论】:

  • 答案是正确的:你从错误的一端开始。阅读一本关于 JUnit 和单元测试的好书或教程,例如:vogella.com/tutorials/JUnit/article.html,然后从非常小的单元开始测试。当然,使用 JUnit 自动化大型集成测试是可能的,有时也很有用。但你应该明白,你所做的并不是“单元”测试。
  • 更像“集成测试”吗??

标签: android mockito retrofit mvp


【解决方案1】:

不,你不是。出于几个原因。首先,你这里没有测试。你没有一个断言。无论发生什么,您的代码都会说通过。所以这不是一个测试。一个测试是使用有效的登录名调用 doLogin,并确保调用 loginListener.authOK()。然后另一个使用错误密码的测试,并检查是否调用了 showError。没有它,你所拥有的一切都是浪费时间。

第二——这是一个可怕的单元测试范围。对于单元测试,您应该检查最小的代码单元是否有效。在这里,您正在检查您的整个网络堆栈和服务器是否正常工作。这太过分了。并且单元测试不应该依赖于外部服务器的工作,这只会导致不稳定的测试——类似的东西应该在集成套件中。

您的代码现在没有针对测试进行优化。如果是这样,您将不会通过代码中的单例创建改造客户端。你会把它传递给doLogin。这样,您可以在可能返回虚假响应的测试中传递一个模拟,然后测试您的代码是否可以正确识别虚假的成功和失败响应,删除服务器依赖项,同时测试所有功能。

【讨论】:

  • 谢谢,我还有很多东西要学。我将再次研究如何进行适当的单元测试和集成测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
相关资源
最近更新 更多