MVP 用户登录实例参考: https://blog.csdn.net/whjk20/article/details/112511365
使用MVP的一大优势就是可以方便编写测试用例(Android test / Java unit test)
例如针对Model 返回结果的测试 ,实际上就是对Presenter的逻辑功能进行测试.
这里因为Model(LoginIterator ) 里使用到Handler, 因此使用Android test. (最好是可以抽离android framework 部分, 以便进行java unit test, 即不必使用设备或者模拟器进行测试)
测试用例比较简单,直接贴代码:
package com.example.mvplogindemo;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.example.mvplogindemo.model.LoginIterator;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertTrue;
@RunWith(AndroidJUnit4.class)
public class PresenterTest {
private static final int RET_UNKNOWN = -1;
private static final int RET_SUCCESS = 0;
private static final int RET_USERNAME_ERROR = 1;
private static final int RET_PASSWORD_ERROR = 2;
private int mLoginResult = RET_UNKNOWN;
@Test
public void testLoginIterator() {
LoginIterator model = new LoginIterator();
LoginIterator.OnLoginFinishedListener listener = new LoginIterator.OnLoginFinishedListener() {
@Override
public void onUsernameError() {
mLoginResult = RET_USERNAME_ERROR;
}
@Override
public void onPasswordError() {
mLoginResult = RET_PASSWORD_ERROR;
}
@Override
public void onSuccess() {
mLoginResult = RET_SUCCESS;
}
};
model.login("", "123", listener);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
assertTrue(mLoginResult == RET_USERNAME_ERROR);
model.login("tom", "", listener);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
assertTrue(mLoginResult == RET_PASSWORD_ERROR);
model.login("john", "123", listener);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
assertTrue(mLoginResult == RET_SUCCESS);
}
}
其中:
(1) 因为要使用到Handler, 所以需要加上以下语句表示是Android test
@RunWith(AndroidJUnit4.class)
(2) 自定义了期望的数据返回的类型,以便做验证
private static final int RET_UNKNOWN = -1;
private static final int RET_SUCCESS = 0;
private static final int RET_USERNAME_ERROR = 1;
private static final int RET_PASSWORD_ERROR = 2;
(3) 为了模拟用户验证的情况,分别传递名字为空、密码为空、名字和密码都不为空,并记录验证结果,与期望的结果对比
例如:
model.login("", "123", listener); assertTrue(mLoginResult == RET_USERNAME_ERROR);
但是考虑到model 处理时延迟了两秒返回结果, 因此上面这两个操作之间至少延迟两秒再验证结果 (这里延迟3s)
try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); }