Android Studio 2.1.2
Tôi muốn kiểm tra xem callbacks onUsernameError, onPasswordError và onSuccess, trong LoginModelImp có thực sự được gọi hay không. Tôi không chắc chắn cách kiểm tra trình xử lý sự kiện. Tuy nhiên, kiểm tra không thành công vì những hàm này không bao giờ được gọi. Tôi chế giễu chúng với mockito và cố gắng xác minh chúng.Kiểm tra đơn vị MVP bằng cách sử dụng mockito với trình nghe sự kiện
Đây là mã của tôi cho đến thời điểm này.
giao diện trình bày
public interface LoginPresenterContract<LoginFragmentViewContract> {
void validateCredentials();
void attachView(LoginFragmentViewContract view);
void detachView();
}
thực hiện Presenter
public class LoginPresenterImp implements LoginPresenterContract<LoginFragmentViewContract>, LoginModelContract.OnLoginCompletedListener {
private LoginModelContract mLoginModelContract;
private LoginFragmentViewContract mLoginFragmentView;
public LoginPresenterImp(LoginModelContract loginModelContract) {
mLoginModelContract = loginModelContract;
}
/*
* LoginPresenterContact - implementation
*/
@Override
public void attachView(LoginFragmentViewContract view) {
mLoginFragmentView = view;
}
@Override
public void detachView() {
mLoginFragmentView = null;
}
@Override
public void validateCredentials() {
if(mLoginModelContract != null) {
mLoginModelContract.login(
mLoginFragmentView.getUsername(),
mLoginFragmentView.getPassword(),
LoginPresenterImp.this);
}
}
/*
* LoginModelContract.OnLoginCompletedListener - implementation
*/
@Override
public void onUsernameError() {
if(mLoginFragmentView != null) {
mLoginFragmentView.onLoginFailed("Incorrect username");
}
}
@Override
public void onPasswordError() {
if(mLoginFragmentView != null) {
mLoginFragmentView.onLoginFailed("Incorrect password");
}
}
@Override
public void onSuccess() {
if(mLoginFragmentView != null) {
mLoginFragmentView.onLoginSuccess();
}
}
}
giao diện mẫu
public interface LoginModelContract {
interface OnLoginCompletedListener {
void onUsernameError();
void onPasswordError();
void onSuccess();
}
void login(String username, String password, OnLoginCompletedListener onLoginCompletedListener);
}
mẫu thực hiện
public class LoginModelImp implements LoginModelContract {
/* Testing Valid username and passwords */
private static String validUsername = "steve";
private static String validPassword = "1234";
@Override
public void login(final String username,
final String password,
final OnLoginCompletedListener onLoginCompletedListener) {
boolean hasSuccess = true;
if(TextUtils.isEmpty(username) || !username.equals(validUsername)) {
/* TEST onUsernameError() */
onLoginCompletedListener.onUsernameError();
hasSuccess = false;
}
if(TextUtils.isEmpty(password) || !password.equals(validPassword)) {
/* TEST onPasswordError() */
onLoginCompletedListener.onPasswordError();
hasSuccess = false;
}
if(hasSuccess) {
/* TEST onSuccess() */
onLoginCompletedListener.onSuccess();
}
}
}
kiểm tra Junit4 với Mockito
public class LoginPresenterImpTest {
private LoginFragmentViewContract mMockViewContract;
private LoginModelContract mMockModelContract;
private LoginModelContract.OnLoginCompletedListener mMockOnLoginCompletedListener;
private LoginPresenterContract<LoginFragmentViewContract> mLoginPresenterContract;
@Before
public void setUp() throws Exception {
mMockViewContract = Mockito.mock(LoginFragmentViewContract.class);
mMockModelContract = Mockito.mock(LoginModelContract.class);
mMockOnLoginCompletedListener = Mockito.mock(LoginModelContract.OnLoginCompletedListener.class);
mLoginPresenterContract = new LoginPresenterImp(mMockModelContract);
mLoginPresenterContract.attachView(mMockViewContract);
}
@Test
public void shouldSuccessWithValidCredentials() {
when(mMockViewContract.getUsername()).thenReturn("steve");
when(mMockViewContract.getPassword()).thenReturn("1234");
mLoginPresenterContract.validateCredentials();
verify(mMockViewContract, times(1)).getUsername();
verify(mMockViewContract, times(1)).getPassword();
verify(mMockOnLoginCompletedListener, times(1)).onSuccess();
verify(mMockOnLoginCompletedListener, never()).onPasswordError();
verify(mMockOnLoginCompletedListener, never()).onUsernameError();
}
}
Có cách nào để kiểm tra thực hiện điều này?
Rất cám ơn mọi đề xuất,
cảm ơn, Điều này có vẻ như một giải pháp tốt. Chỉ cần chờ đợi để xem phản ứng khác. – ant2009
Hey @Lorenzo Tôi đang đối mặt với cùng một vấn đề nhưng trong trường hợp của tôi, tôi muốn xác thực dựa trên cơ sở dữ liệu sqlite bất kỳ ý tưởng làm thế nào để làm điều đó? – Tony