gpt4 book ai didi

android - 如何在表示层上编写适当的 android 单元测试

转载 作者:太空宇宙 更新时间:2023-11-03 13:15:52 25 4
gpt4 key购买 nike

我假设在使用模型- View -展示器 (MVP) 模式时编写单元测试会容易得多,但我不确定如何开始。我添加了依赖项以开始使用 RoboelectricMockito 编写单元测试,以模拟我的演示者中使用的所有依赖项。

作为引用,这里是我的演示者登录示例:

public class LoginPresenterImpl implements ILoginPresenter {

@Inject
Bus bus;

@Inject
ISharedPreferencesRepository mSharedPreferencesRepository;

private final String LOG_TAG = "LOGIN_PRESENTER";
private ILoginView loginView;
private LoginInteractorImpl loginInteractor;
private long mLastClickTime = 0;

public LoginPresenterImpl() {
MyApplication.getObjectGraph().inject(this);
this.loginInteractor = new LoginInteractorImpl();
}

@Override
public void setLoginView(ILoginView loginView) {
this.loginView = loginView;

if(mSharedPreferencesRepository.isLoggedIn()) {
Log.i(LOG_TAG, "User logged in already");
this.loginView.navigateToHome();
}
}

@Override
public void validateCredentials(String username, String password) {
if(SystemClock.elapsedRealtime() - mLastClickTime < 1000)
return;
mLastClickTime = SystemClock.elapsedRealtime();

if(username.equals("") || username == null) {
loginView.setUsernameError();
return;
} else if(password.equals("") || password == null){
loginView.setPasswordError();
return;
}

loginView.showProgress();
loginInteractor.login(username, password, this);
}

@Override
public void onUsernameError() {
loginView.setUsernameError();
loginView.hideProgress();
}

@Override
public void onPasswordError() {
loginView.setPasswordError();
loginView.hideProgress();
}

@Subscribe
@Override
public void onSuccess(LoginEvent event) {
if (event.getIsSuccess()) {
mSharedPreferencesRepository.setLogin(true);
mSharedPreferencesRepository.setFirstTime(true);
mSharedPreferencesRepository.setUserId(event.getUserId());

loginView.navigateToHome();
loginView.hideProgress();
}
}

现在开始我的单元测试(尝试):

首先,如果我错了请纠正我,但为了开始编写我的测试用例,我需要模拟一些对象:总线ISharedPreferencesRepositoryILoginViewLoginInteractorImpl

我最终得到了这样的东西:

@RunWith(MockitoJUnitRunner.class)
public class LoginPresenterImplTest {

@Mock
private ILoginView view;

@Mock
private LoginInteractorImpl interactor;

@Mock
private LoginPresenterImpl presenter;

@Before
public void setUp(){

}


@Test
public void shouldShowErrorMessageWhenUsernameIsEmpty() throws Exception {
when(view.getUsername()).thenReturn("");
when(view.getPassword()).thenReturn("test");
presenter.validateCredentials(view.getUsername(), view.getPassword());
}
}

我对接下来要采取的步骤有点迷茫。我试图通过添加 verify(view, times(1)).setUsernameError(); 来验证方法 loiginView.setOnUsernameError() 将在这种情况下被调用但这没有通过我的测试。

最佳答案

我不建议在演示者中使用 Android 类。这将允许您将演示者作为本地单元测试(经典 Java 单元测试)进行测试。

如果您仍想在演示器中使用 Android 类,请不要使用 dagger 属性注入(inject)演示器依赖项。我要做的只是将它们传递给演示者的构造函数。

然后,mock所有presenter的依赖,创建要测试的Presenter。您正在 mock 要测试的演示者。不要那样做,只需创建一个新的 LoginPresenterImpl 并通过 setUp 方法中的构造函数将其所有依赖项传递给它以对其进行初始化。

Here你有几个简单完成的演示者测试的好例子。

关于android - 如何在表示层上编写适当的 android 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36192529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com