我为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
);
如何处理?谢谢
答案 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);