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();
});
}
}
Mocked Repository。获取模拟数据。
class MockContactRepository implements ContactRepository{
Future<List<Contact>> fetch(){
return new Future.value(kContacts);
}
}
答案 0 :(得分:2)
调用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);
});
如果方法未被调用一次,则测试将失败。
答案 1 :(得分:0)
Mockito为两者提供本机支持
至少可以测试一次您的方法是否已被调用
verify(<your-method-with-expected-params>)
,这将验证您的方法已调用(无论调用了多少次)。要验证它已被调用特定次数,可以将其与.called(<number-of-calls-expected>)
要测试未调用您的方法,您应该使用verifyNever(<your-method-with-expected-params>)
,这将验证您的方法未被调用
请确保传递给verify
和verifyNever
的方法都是Mockito所模拟的方法。