如何在模型视图演示器架构中使用 mockito 测试演示器 class android
how to test presenter class using mockito in model-view-presenter architecture android
我想使用 mockito 为演示者 class 创建一个测试,尝试了几种方法,但在下面提到了错误。我正在关注这些链接 here and here 和我的主持人 class
public class SignInPresenterImpl extends BasePresenterImpl implements SignInPresenter {
private SignInView mSignInView;
private SignInInteractor mSignInInteractor;
/**
* Constructor
*
* @param signInView the associated SignIn view
*/
public SignInPresenterImpl(@NonNull final SignInView signInView) {
mSignInView = signInView;
mSignInInteractor = new SignInInteractorImpl();
}
@Override
public void onSignInClicked(final String email, final String password) {
// checking for validation
if (!ValidationUtil.checkEmail(email)) {
mSignInView.showErrorMessage(R.string.error_invalid_email);
return;
}
if (!ValidationUtil.checkPassword(password)) {
mSignInView.showErrorMessage(R.string.error_invalid_password);
return;
}
mSignInView.showLoading();
mSignInInteractor.login(email, password, new BaseInteractor.ApiListener() {
@Override
public void onSuccess(final CommonResponse commonResponse) {
//todo handle success
}
@Override
public void onFailure(final ApiError apiError, final Throwable throwable) {
if (isViewAttached()) {
mSignInView.hideLoading();
if (apiError != null) {
mSignInView.showErrorMessage(apiError.getMessage());
} else {
// resolve error through throwable
mSignInView.showErrorMessage(parseThrowableMessage(throwable));
}
}
}
});
}
}
我的主持人测试 class 是
public class SignInPresenterImplTest {
@Mock
BaseInteractor.ApiListener listener;
@Mock
private SignInView mSignInView;
@Mock
private SignInInteractor mSignInInteractor;
private SignInPresenter signInPresenter;
@Before
public void setUp() throws Exception {
// Mockito has a very convenient way to inject mocks by using the @Mock annotation. To
// inject the mocks in the test the initMocks method needs to be called.
MockitoAnnotations.initMocks(this);
//Get a refrence to the class test.
signInPresenter = new SignInPresenterImpl(mSignInView);
}
@Test
public void signInAndShowProgress() {
signInPresenter.onSignInClicked("", "");
mSignInView.showErrorMessage("");
verify(mSignInView).showLoading("Loading");
}
}
mSignInView 显示以下错误
Wanted but not invoked: mSignInView.showLoading("Loading");
请建议我如何以正确的方式实施测试用例,我做错了什么。
提前致谢
在您的测试方法中,showLoading
方法被调用时没有属性。我认为您应该预料到并可能验证没有显示任何错误消息:
@Test
public void signInAndShowProgress() {
signInPresenter.onSignInClicked("", "");
verify(mSignInView, times(0)).showErrorMessage(Mockito.any(String.class));
verify(mSignInView).showLoading();
}
我想使用 mockito 为演示者 class 创建一个测试,尝试了几种方法,但在下面提到了错误。我正在关注这些链接 here and here 和我的主持人 class
public class SignInPresenterImpl extends BasePresenterImpl implements SignInPresenter {
private SignInView mSignInView;
private SignInInteractor mSignInInteractor;
/**
* Constructor
*
* @param signInView the associated SignIn view
*/
public SignInPresenterImpl(@NonNull final SignInView signInView) {
mSignInView = signInView;
mSignInInteractor = new SignInInteractorImpl();
}
@Override
public void onSignInClicked(final String email, final String password) {
// checking for validation
if (!ValidationUtil.checkEmail(email)) {
mSignInView.showErrorMessage(R.string.error_invalid_email);
return;
}
if (!ValidationUtil.checkPassword(password)) {
mSignInView.showErrorMessage(R.string.error_invalid_password);
return;
}
mSignInView.showLoading();
mSignInInteractor.login(email, password, new BaseInteractor.ApiListener() {
@Override
public void onSuccess(final CommonResponse commonResponse) {
//todo handle success
}
@Override
public void onFailure(final ApiError apiError, final Throwable throwable) {
if (isViewAttached()) {
mSignInView.hideLoading();
if (apiError != null) {
mSignInView.showErrorMessage(apiError.getMessage());
} else {
// resolve error through throwable
mSignInView.showErrorMessage(parseThrowableMessage(throwable));
}
}
}
});
}
}
我的主持人测试 class 是
public class SignInPresenterImplTest {
@Mock
BaseInteractor.ApiListener listener;
@Mock
private SignInView mSignInView;
@Mock
private SignInInteractor mSignInInteractor;
private SignInPresenter signInPresenter;
@Before
public void setUp() throws Exception {
// Mockito has a very convenient way to inject mocks by using the @Mock annotation. To
// inject the mocks in the test the initMocks method needs to be called.
MockitoAnnotations.initMocks(this);
//Get a refrence to the class test.
signInPresenter = new SignInPresenterImpl(mSignInView);
}
@Test
public void signInAndShowProgress() {
signInPresenter.onSignInClicked("", "");
mSignInView.showErrorMessage("");
verify(mSignInView).showLoading("Loading");
}
}
mSignInView 显示以下错误
Wanted but not invoked: mSignInView.showLoading("Loading");
请建议我如何以正确的方式实施测试用例,我做错了什么。
提前致谢
在您的测试方法中,showLoading
方法被调用时没有属性。我认为您应该预料到并可能验证没有显示任何错误消息:
@Test
public void signInAndShowProgress() {
signInPresenter.onSignInClicked("", "");
verify(mSignInView, times(0)).showErrorMessage(Mockito.any(String.class));
verify(mSignInView).showLoading();
}