原文
很久以后,这是系列的第三篇教程。 我希望你们都做得很好,享受教程系列(阅读,编码和改进)。
到目前为止,在本系列的第1部分和第2部分,为什么开发人员害怕重构代码,我们获得了为什么TDD至高无上,Android测试的类型,测试的位置,如何编写和运行测试等。
我们覆盖了单元测试到现在,接下来我们将转向集成测试,以验证演示者是否应对UI。
如图所示,我们可以创建用于登录的用户界面(我知道你会比这更好的用户界面)。
所以我们将编写一些与UI相关的代码。 我们在View和Presenter之间签有合同,即LoginView,如下所示。
1 2 3 4 5
| public interface LoginView { void showLoginSuccessMessage(); void showLoginFailedMessage(); void showLoginAttemptExceededMessage(); }
|
现在我们将LoginView实现为我们的Activity,如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| public class LoginActivity extends AppCompatActivity implements LoginView { private EditText usernameEditText; private EditText passwordEditText; private Button loginButton; private LoginPresenter loginPresenter;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); loginPresenter = new LoginPresenter(); initView(); }
private void initView() { usernameEditText = (EditText) findViewById(R.id.username_edit_text); passwordEditText = (EditText) findViewById(R.id.password_edit_text); loginButton = (Button) findViewById(R.id.login_button);
loginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { loginPresenter.validateCredentialsAndPerformLogin( usernameEditText.getText().toString(), passwordEditText.getText().toString()); } }); }
@Override public void showLoginSuccessMessage() { Toast.makeText(this, "Login Success", Toast.LENGTH_SHORT).show(); }
@Override public void showLoginFailedMessage() { Toast.makeText(this, "Login Failed", Toast.LENGTH_SHORT).show(); }
@Override public void showLoginAttemptExceededMessage() { Toast.makeText(this, "Login Attempt Exceeded", Toast.LENGTH_SHORT).show(); } }
|
我们的Presenter实现如下所示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| public class LoginPresenter { private LoginView loginView; private int loginAttempt;
public LoginPresenter(LoginView loginView) { this.loginView = loginView; }
public void validateCredentialsAndPerformLogin(String username, String password) { if (isLoginAttemptExceeded()) { loginView.showLoginAttemptExceededMessage(); return; }
incrementLoginAttempt();
if (username.equals("admin") && password.equals("admin")) { loginView.showLoginSuccessMessage(); } else { loginView.showLoginFailedMessage(); } }
private void incrementLoginAttempt() { loginAttempt++; }
private boolean isLoginAttemptExceeded() { return loginAttempt >= 3; } }
|
您将在LoginPresenterTest中发生错误,因为我们有构建使用LoginView对象的Presenter的构造函数。
为了摆脱这个错误,我们必须在创建演示者对象时将LoginView的对象传递给Presenter。 所以我们必须模拟LoginView.Here来模仿😍。
什么是模仿?
你有一个对象,你想要测试的方法,这些方法都依赖于其他对象。 您创建依赖对象的模拟,而不是创建该依赖关系的实际实例。 模拟对象用于单元测试。
为了模仿,我们将使用Mockito。
将以下testCompile依赖项添加到应用程序的build.gradle
1
| testCompile 'org.mockito:mockito-core:1.10.19'
|
现在我们模仿我们的LoginView,如下所示
Ooho😳,😎我们有我们的模拟(神奇)登录对象,可以传递给Presenter。 所以我们的实现就像下图
运行测试显示绿色信号继续。
集成测试(Presenter和View之间)
要验证Presenter调用正确的View方法后,我们使用verify()。
在上面的代码图中,验证方法确保在视图对象上调用showLoginSuccessMessage(),这确保我们的Presenter正确地与View集成。
其他测试如下
End
同时,希望听到有关这方面的建议和意见。
干杯🍻!!!