class MockView extends Mock implements ContactListViewContract {
@override
void onLoadContactsComplete(List<Contact> items) {
}
@override
void onLoadContactsError() {}
}
void main() {
test('ContactListPresenter test', () {
Injector.configure(Flavor.MOCK);
MockView view = new MockView();
ContactListPresenter presenter = new ContactListPresenter(view);
presenter.loadContacts();
verify(view.onLoadContactsComplete).called(1);
});
}
我想确保何时从代码调用presenter.loadContacts()
,然后验证也调用了view.onLoadContactsComplete
但收到错误:
用于非模拟对象
有没有可能用Mockito做到这一点?
更新:
abstract class ContactListViewContract {
void onLoadContactsComplete(List<Contact> items);
void onLoadContactsError();
}
这里称为onLoadContactsComplete
方法。
class ContactListPresenter {
ContactListViewContract _view;
ContactRepository _repository;
ContactListPresenter(this._view){
_repository = new Injector().contactRepository;
}
void loadContacts(){
assert(_view != null);
_repository.fetch()
.then((contacts) {
print(contacts);
_view.onLoadContactsComplete(contacts); // here the onLoadContactsComplete method is called
}).catchError((onError) {
print(onError);
_view.onLoadContactsError();
});
}
}
模拟存储库。获取模拟数据。
class MockContactRepository implements ContactRepository{
Future<List<Contact>> fetch(){
return new Future.value(kContacts);
}
}
调用verify
方法时,您需要在模拟上调用实际方法
尝试
test('ContactListPresenter test', () async {
Injector.configure(Flavor.MOCK);
MockView view = new MockView();
ContactListPresenter presenter = new ContactListPresenter(view);
presenter.loadContacts();
await untilCalled(view.onLoadContactsComplete(typed(any)));
//completes when view.onLoadContactsComplete(any) is called
verify(view.onLoadContactsComplete(typed(any))).called(1);
});
如果未调用该方法一次,则测试将失败。
Mockito为两者提供了本机支持
-
若要测试您的方法是否已至少被调用一次,您可以使用
verify(<your-method-with-expected-params>)
这将验证您的方法是否已调用(无论调用多少次(。若要验证是否已调用特定次数,可以使用.called(<number-of-calls-expected>)
-
若要测试你的方法是否未被调用,你应该使用
verifyNever(<your-method-with-expected-params>)
这将验证你的方法是否未被调用
确保传递给verify
和verifyNever
的方法都是被Mockito
您可以使用 never 并验证 ZeroInteractions
//interaction with mockOne
mockOne.add("one");
//ordinary interaction
verify(mockOne).add("one");
//we never interaction into the mock
verify(mockOne, never()).add("two");
//verify we don't use in the mock
verifyZeroInteractions(mockTwo, mockThree);
*将验证零交互标记为在 mockito-kotlin 中已弃用引入用于验证无交互的别名