Mockito thenReturn 没有按预期工作
Mockito thenReturn not working as expected
我在使用 mockito 时遇到问题。我正在模拟一个 class 然后在它的方法上使用 thenReturn()
。但似乎出了点问题。这是代码。
测试代码:
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 上运行。这里出了什么问题?
NPE 告诉我们这一行:
mGroupFeatureData.getCards(path, id, 10, lastIndex);
... returns 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
是一个整数,所以这将匹配给定的参数匹配器:Mockito.anyInt()
- 第四个参数
lastIndex
被声明为一个整数,因此这将匹配给定的参数匹配器:Mockito.anyInt()
- 第一个和第二个参数的 type 从您的代码摘录中不清楚,因为我们看不到
path
和 id
在哪里声明,但是除非它们都是 both 类型 String
否则这些参数 (Mockito.anyString()
) 的给定参数匹配器将不匹配,因此模拟调用将 return null
.
所以,在我看来 path
和 id
中的一个或另一个实际上不是 String
类型。如果您可以更新您的问题以显示这些类型的声明位置,那将很有用。
我在使用 mockito 时遇到问题。我正在模拟一个 class 然后在它的方法上使用 thenReturn()
。但似乎出了点问题。这是代码。
测试代码:
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 上运行。这里出了什么问题?
NPE 告诉我们这一行:
mGroupFeatureData.getCards(path, id, 10, lastIndex);
... returns 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
是一个整数,所以这将匹配给定的参数匹配器:Mockito.anyInt()
- 第四个参数
lastIndex
被声明为一个整数,因此这将匹配给定的参数匹配器:Mockito.anyInt()
- 第一个和第二个参数的 type 从您的代码摘录中不清楚,因为我们看不到
path
和id
在哪里声明,但是除非它们都是 both 类型String
否则这些参数 (Mockito.anyString()
) 的给定参数匹配器将不匹配,因此模拟调用将 returnnull
.
所以,在我看来 path
和 id
中的一个或另一个实际上不是 String
类型。如果您可以更新您的问题以显示这些类型的声明位置,那将很有用。