【发布时间】:2016-02-24 10:32:54
【问题描述】:
我正在尝试在我的应用程序中测试我的 ViewModel,这是构造函数:
@Inject
public SearchUserViewModel(@Named("searchUser") UseCase searchUserUseCase) {
this.searchUserUseCase = searchUserUseCase;
}
在我的测试中,我使用这样的模拟创建了一个 SearchUserUseCase:
Observable error = Observable.error(new Throwable("Error"));
when(gitHubService.searchUser(MockFactory.TEST_USERNAME_ERROR)).thenReturn(error);
when(ObserverThread.getScheduler()).thenReturn(Schedulers.immediate());
when(SubscriberThread.getScheduler()).thenReturn(Schedulers.immediate());
searchUserUseCase = new SearchUserUseCase(gitHubService, SubscriberThread, ObserverThread);
在我的 ViewModel 类中,我有这个要测试的 sn-p:
public void onClickSearch(View view) {
loadUsers();
}
private void loadUsers() {
if (username == null) {
fragmentListener.showMessage("Enter a username");
} else {
showProgressIndicator(true);
searchUserUseCase.execute(new SearchUserSubscriber(), username);
}
}
private final class SearchUserSubscriber extends DefaultSubscriber<SearchResponse> {
@Override
public void onCompleted() {
showProgressIndicator(false);
}
@Override
public void onError(Throwable e) {
showProgressIndicator(false);
fragmentListener.showMessage("Error loading users");
}
@Override
public void onNext(SearchResponse searchResponse) {
List<User> users = searchResponse.getUsers();
if (users.isEmpty()) {
fragmentListener.showMessage("No users found");
} else {
fragmentListener.addUsers(users);
}
}
}
最后在我的测试中我有这个:
@Test
public void shouldDisplayErrorMessageIfErrorWhenLoadingUsers() {
SearchUserViewModel searchUserViewModel = new SearchUserViewModel(searchUserUseCase);
searchUserViewModel.setFragmentListener(mockFragmentListener);
searchUserViewModel.setUsername(MockFactory.TEST_USERNAME_ERROR);
searchUserViewModel.onClickSearch(view);
verify(mockFragmentListener).showMessage("Error loading users");
}
我从 Mockito 收到此错误:
Wanted but not invoked:
fragmentListener.showMessage(
"Error loading users"
);
我不确定这是否是一个好的测试,但我想以某种方式测试 SearchUserSubscriber。谢谢
编辑:我在这里找到了与此问题类似的问题:Can't verify mock method call from RxJava Subscriber(仍然没有回答)和这里:Verify interactions in rxjava subscribers。后一个问题类似,但不会在单独的类中执行订阅者(发生在 SearchUserUseCase 此处)。
我还尝试了 RobolectricGradleTestRunner 而不是 MockitoJunitRunner 并更改为 Schedulers.io() 和 AndroidSchedulers.mainThread(),但我仍然遇到相同的错误。
尝试模拟 SearchUserUseCase 而不是 GitHubService(感觉更干净),但我不确定如何以这种方式测试订阅者,因为它作为参数传递给 UseCase 中的 void 方法 execute()。
public void execute(Subscriber useCaseSubscriber, String query) {
subscription = buildUseCase(query)
.observeOn(postExecutionThread.getScheduler())
.subscribeOn(threadExecutor.getScheduler())
.subscribe(useCaseSubscriber);
}
还有 buildUseCase()
@Override
public Observable buildUseCase(String username) throws NullPointerException {
if (username == null) {
throw new NullPointerException("Query must not be null");
}
return getGitHubService().searchUser(username);
}
【问题讨论】:
-
我不知道最初是什么问题,但经过一些来回重构后它现在可以工作了。我最终得到了与问题中完全相同的代码。
标签: android testing mocking mockito