实际调用具有不同的参数Unit Presenter

时间:2017-11-05 13:02:59

标签: android unit-testing junit mockito

我为Presenter创建了一个单元测试。如果从API(使用Interactor)成功加载数据,我的Presenter实现了Listener回调:

PresenterTest.java

public class MainContactPresenterTest {
    @Mock LoadContactInteractor loadContactInteractor;
    @Mock ApiService apiService;

    @Mock LoadContactView loadContactView;
    @Mock ContactRepository contactRepository;
    @Mock LoadContactInteractor.OnLoadDataFinishedListener listener;

    @InjectMocks MainContactPresenterImpl presenter;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void getContactLists() {
        // given
        // when
        presenter.fetchRemoteContacts();

        // then
        Mockito.verify(loadContactInteractor).onLoadData(listener);
    }
}

这是我的演示者:

public class MainContactPresenterImpl implements MainContactPresenter,
        LoadContactInteractor.OnLoadDataFinishedListener {

    private LoadContactView loadContactView;
    private LoadContactInteractor loadContactInteractor;
    private ContactRepository contactRepository;

    @Inject
    public MainContactPresenterImpl(LoadContactInteractor loadContactInteractor,
                                    @NonNull LoadContactView loadContactView,
                                    ContactRepository contactRepository) {
        this.loadContactView = loadContactView;
        this.loadContactInteractor = loadContactInteractor;
        this.contactRepository = contactRepository;
    }

    @Override
    public void onSuccessLoad(List<Contact> contacts) {
        loadContactView.saveDataToLocalStorage(contacts);
    }

    @Override
    public void onErrorLoad() {
        loadContactView.dismissProgress();
        loadContactView.showErrorMessage();
    }

    @Override
    public void preCheckCacheData() {
        if (contactRepository.getContactCount() == 0) {
            // Load contacts from Server
            fetchRemoteContacts();
        } else {
            fetchLocalContacts();
        }
    }

    @Override
    public void fetchRemoteContacts() {
        loadContactView.showProgress();

        loadContactInteractor.onLoadData(this);
    }
}

但是当我运行测试时,我在verify中得到的模拟参数不匹配。 我让我的主持人必须成为一个争论者。不是听众。

Argument(s) are different! Wanted:
loadContactInteractor.onLoadData(
    listener
);

Actual invocation has different arguments:
loadContactInteractor.onLoadData(
   fanjavaid.gojek.com.contacts.presenter.MainContactPresenterImpl@1757cd72
);

如何处理?谢谢

1 个答案:

答案 0 :(得分:1)

你正在创建一个模拟......

@Mock LoadContactInteractor.OnLoadDataFinishedListener listener;

...然后你不再使用它,当verify告诉你它没有被实际使用时,你会感到惊讶。为什么?当然它没有被使用,因为你从不在任何地方使用它,所以你的类应该如何知道使用那个模拟对象?

您的MainContactPresenterImpl没有使用 OnLoadDataFinishedListener作为外部依赖项(然后您可以通过@InjectMocks注入它),是< / strong>本身就是一个倾听者,因此嘲笑另一个听众在这里毫无意义。

换句话说,MainContactPresenterImpl没有OnLoadDataFinishedListener field,因此Mockito当然无法在此不存在的字段中注入某些内容。要使这样的内容起作用,您需要添加此类字段,然后在调用onLoadData方法时使用该字段的内容。

您方法的唯一调用就在这里......

loadContactInteractor.onLoadData(this);

那个背景下的this是什么?它是包含该方法的MainContactPresenterImpl对象,换句话说,就是您的presenter

那么,将起作用的是......

Mockito.verify(loadContactInteractor).onLoadData(presenter);