0%

如何在Android中执行TDD?第3部分 - 模拟和集成测试(译)

原文

很久以后,这是系列的第三篇教程。 我希望你们都做得很好,享受教程系列(阅读,编码和改进)。

到目前为止,在本系列的第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

同时,希望听到有关这方面的建议和意见。

干杯🍻!!!