Mockito然后返回不按预期工作

时间:2017-09-09 06:39:49

标签: android mockito android-testing

我对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进行操作。这里出了什么问题?

1 个答案:

答案 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()
  • 第一个和第二个争论的类型在您的代码摘录中不明确,因为我们没有看到声明pathid的位置,但除非它们类型String,然后这些参数(Mockito.anyString())的给定参数匹配将不匹配,因此模拟的调用将返回null

因此,我认为pathid中的一个或另一个实际上不是String类型。如果您可以更新您的问题以显示声明这些类型的位置,将会很有用。