我为Presenter创建了一个单元测试。如果成功地从API加载数据,则我的演示者实现侦听器回调(使用交互程序):
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
中的mocking参数不匹配。我的演讲者一定是一场争论。不是听众。
Argument(s) are different! Wanted:
loadContactInteractor.onLoadData(
listener
);
Actual invocation has different arguments:
loadContactInteractor.onLoadData(
fanjavaid.gojek.com.contacts.presenter.MainContactPresenterImpl@1757cd72
);
如何处理?谢谢
您正在创建一个mock。。。
@Mock LoadContactInteractor.OnLoadDataFinishedListener listener;
然后你再也不用它了,当verify
告诉你它并没有被实际使用时,你表现得很惊讶。为什么?当然,它没有被使用,因为你从来没有在任何地方使用过它,那么你的类应该如何知道使用那个mock对象呢?
您的MainContactPresenterImpl
不使用OnLoadDataFinishedListener
作为外部依赖项(然后您可以通过@InjectMocks
注入它),它本身就是一个监听器,因此嘲笑另一个监听器在这里毫无意义。
换句话说,MainContactPresenterImpl
没有OnLoadDataFinishedListener
field
,所以Mockito当然无法在这个不存在的领域中注入一些东西。要使类似的操作正常,您需要添加这样一个字段,然后在调用onLoadData
方法时使用该字段的内容。
您的方法的唯一调用在这里。。。
loadContactInteractor.onLoadData(this);
在这种情况下this
是什么?它是包含方法的MainContactPresenterImpl
对象,换句话说,就是您的presenter
。
所以,有效的是…
Mockito.verify(loadContactInteractor).onLoadData(presenter);