我对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
的模拟可观察的操作中进行操作。这里出了什么问题?
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()
- 从您的代码提取物中尚不清楚第一个和第二个论点的 type ,因为我们看不到
path
和id
在哪里声明,但是除非它们是 type of typeString
然后给定的参数的给定参数匹配器(Mockito.anyString()
)将不匹配,因此模拟的调用将返回null
。
因此,在我看来,它看起来像path
中的一个或另一个id
实际上不是String
类型。如果您可以更新问题以显示这些类型的声明位置,那将是有用的。