ant*_*009 10 android unit-testing junit4 mockito
Android Studio 2.1.2
Run Code Online (Sandbox Code Playgroud)
我想测试实际调用LoginModelImp中的回调onUsernameError,onPasswordError和onSuccess.我不确定如何测试事件监听器.但是,测试失败,因为从不调用这些函数.我用mockito嘲笑他们并试图验证它们.
到目前为止这是我的代码.
演示者界面
public interface LoginPresenterContract<LoginFragmentViewContract> {
void validateCredentials();
void attachView(LoginFragmentViewContract view);
void detachView();
}
Run Code Online (Sandbox Code Playgroud)
演示者实施
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
模型界面
public interface LoginModelContract {
interface OnLoginCompletedListener {
void onUsernameError();
void onPasswordError();
void onSuccess();
}
void login(String username, String password, OnLoginCompletedListener onLoginCompletedListener);
}
Run Code Online (Sandbox Code Playgroud)
模型实施
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
与Mockito进行JUnit4测试
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();
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法测试这个实现?
非常感谢任何建议,
小智 4
测试类LoginPresenterImpTest是关于类的测试LoginPresenterImp,它应该仅使用其实际实现及其协作者的模拟。该类LoginModelContract.OnLoginCompletedListener是 的合作者LoginModelImp,因此在像您这样设计良好的纯单元测试中LoginPresenterImp,它从未被调用是完全正常的。我建议的解决方案是单独测试 LoginModelImp:
public class LoginModelImpTest {
private LoginModelContract.OnLoginCompletedListener mMockOnLoginCompletedListener;
private LoginModelImp loginModelImp;
@Before
public void setUp() throws Exception {
mMockOnLoginCompletedListener = Mockito.mock(LoginModelContract.OnLoginCompletedListener.class);
loginModelImp = new LoginModelImp();
}
@Test
public void shouldSuccessWithValidCredentials() {
loginModelImp.login("steve", "1234", mMockOnLoginCompletedListener);;
verify(mMockOnLoginCompletedListener, times(1)).onSuccess();
verify(mMockOnLoginCompletedListener, never()).onPasswordError();
verify(mMockOnLoginCompletedListener, never()).onUsernameError();
}
}
Run Code Online (Sandbox Code Playgroud)
或者,您必须使用LoginModelImp您的实际实现LoginPresenterImpTest并监视您的侦听器(即演示者本身)或配置模拟以使它们调用侦听器。这是一个例子,但我不会使用这个:
public class LoginPresenterImpTest {
private LoginFragmentViewContract mMockViewContract;
private LoginModelContract mModelContract;
private LoginModelContract.OnLoginCompletedListener mMockOnLoginCompletedListener;
private LoginPresenterContract<LoginFragmentViewContract> mLoginPresenterContract;
@Before
public void setUp() throws Exception {
mMockViewContract = Mockito.mock(LoginFragmentViewContract.class);
mModelContract = new LoginModelImp();
LoginPresenterImp spyPresenterImp = Mockito.spy(new LoginPresenterImp(mModelContract));
mLoginPresenterContract = spyPresenterImp;
mMockOnLoginCompletedListener = spyPresenterImp;
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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2801 次 |
| 最近记录: |