【发布时间】: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