我对mockito有疑问。我嘲笑一个类,然后在其方法上使用thenReturn()
。但似乎出了点问题。这是代码。
TestCode:
public void getCardsTest() {
FeatureFragmentPresenterImpl presenter = new FeatureFragmentPresenterImpl();
GroupFeatureData data = Mockito.mock(GroupFeatureData.class);
FeatureFragmentView view = Mockito.mock(FeatureFragmentView.class);
presenter.init(view, data);
Observable<Response<ResponseBody>> errorObservable = Observable.error(new IOException());
assertNotNull(observable);
Mockito.when(data.getCards(Mockito.anyString(), Mockito.anyString(),
Mockito.anyInt(), Mockito.anyInt())).
thenReturn(errorObservable);
presenter.getAllCards(new Contact(new Name("ssd")), -1);
}
演示者代码:
public void getAllCards(IContact iContact, int lastIndex) {
Observable<Response<ResponseBody>> allCardsResponseObservable = mGroupFeatureData.getCards(path, id, 10, lastIndex);
allCardsResponseObservable
.subscribeOn(Schedulers.io()) -------> Test Failing because NPE here
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new DisposableObserver<Response<ResponseBody>>() {
@Override
public void onNext(@NonNull Response<ResponseBody> response) {
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
});
}
public void init(FeatureFragmentView featureFragmentView,
GroupFeatureData groupFeatureData) {
this.mGroupFeatureData = groupFeatureData;
this.mFeatureFragmentView = featureFragmentView;
}
即使我在测试中嘲笑data.getCards()
的响应,但是在演示者中它会抛出NPE,而它应该只对errorObservable
的模拟Observable进行操作。这里出了什么问题?
答案 0 :(得分:1)
NPE告诉我们这一行:
mGroupFeatureData.getCards(path, id, 10, lastIndex);
...返回null
,这意味着实际的方法调用和你在这里嘲笑的方法调用......
Mockito.when(data.getCards(Mockito.anyString(), Mockito.anyString(),
Mockito.anyInt(), Mockito.anyInt())).
thenReturn(errorObservable);
......不匹配。提供的代码显示了此实际调用:
Observable<Response<ResponseBody>> allCardsResponseObservable =
mGroupFeatureData.getCards(path, id, 10, lastIndex);
打破此次调用我们可以说:
10
是一个int,所以这将匹配给定的参数匹配器:Mockito.anyInt()
lastIndex
被声明为一个int,因此它将匹配给定的参数匹配器:Mockito.anyInt()
path
和id
的位置,但除非它们类型String
的,然后这些参数(Mockito.anyString()
)的给定参数匹配将不匹配,因此模拟的调用将返回null
。因此,我认为path
和id
中的一个或另一个实际上不是String
类型。如果您可以更新您的问题以显示声明这些类型的位置,将会很有用。