>我正在对连接到服务并返回令牌的演示器类进行单元测试当用户从调用 REst 服务的异步任务收到令牌时,主屏幕将启动。如果令牌为空,则显示错误
public void onSignInButtonClicked() {
String username = mSigninView.getUsername();
if (username.isEmpty()) {
mSigninView.showUsernameError(R.string.username_error);
return;
}
String password = mSigninView.getPassword();
if (password.isEmpty()) {
mSigninView.showPasswordError(R.string.password_error);
return;
}
String token = mSigninService.connectToRestServices(username, password);
if (token != null) {
mSigninView.startHomeActivity(token);
} else {
mSigninView.showLoginError(R.string.login_error);
}
}
对于单元测试:
@Test
public void shouldStartHomeScreenWhenUsernameAndPasswordAreCorrect() throws Exception {
Mockito.when(mView.getUsername()).thenReturn("test@test.com");
Mockito.when(mView.getPassword()).thenReturn("test");
Mockito.when(mService.connectToRestServices("test@test.com", "test")).thenReturn("test");
mPresenter.onSignInButtonClicked();
Mockito.verify(mView).startHomeActivity("test");
}
测试时出错
需要但未调用:signin_View.启动主页活动("测试");-> at com.ssd.cypress.uimobile.SigninPresenterTest.shouldStartHomeScreenWhenUsernameAndPasswordAreCorrect(SigninPresenterTest.java:72)
在代码中字符串令牌 = mSigninService.connectToRestServices(用户名、密码);它连接到具体类,令牌为空。有没有办法模拟这个连接到服务,以便它返回某个值。
您的模拟服务协作者mService
在测试期间永远不会被调用,因为它不会传递到或注入到被测试的类中。 根据您的评论,我想您意识到了这一点。
为了重申我的理解您的评论,您想使用协作者的模拟 - Sign_in_service
的实例 - 但您无法这样做,因为协作者是由您创建的,而不是传递到您的测试类中 - SigninPresenter
.
问题是你的SigninPresenter
构造函数,它不应该负责创建协作者。 似乎您拥有有问题的代码,因此您可以更改设计。
我建议您将SigninPresenter
构造函数替换为以下内容:
public static SigninPresenter createSigninPresenterWithService(Signin_View view) {
return new SigninPresenter(view, new Sign_in_service());
}
protected SigninPresenter(Signin_View view, Sign_in_service service) {
mSigninView = view;
mSigninService = service;
}
对于您的测试,您可以调用构造函数并传入服务的模拟来初始化mPresenter
,即:mPresenter = new SignInPresenter(mView, mService)
。 在当前调用 SigninPresenter
构造函数的生产代码中,您可以将构造函数调用new SigninPresenter(view)
替换为对静态工厂方法createSigninPresenterWithService(view)
的调用。