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 从您的代码摘录中不清楚,因为我们看不到 pathid 在哪里声明,但是除非它们都是 both 类型 String 否则这些参数 (Mockito.anyString()) 的给定参数匹配器将不匹配,因此模拟调用将 return null.

所以,在我看来 pathid 中的一个或另一个实际上不是 String 类型。如果您可以更新您的问题以显示这些类型的声明位置,那将很有用。