如何验证是否要调用方法

时间:2018-01-17 03:52:34

标签: unit-testing dart mockito flutter

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);
  }

}

2 个答案:

答案 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为两者提供本机支持

  1. 至少可以测试一次您的方法是否已被调用 verify(<your-method-with-expected-params>),这将验证您的方法已调用(无论调用了多少次)。要验证它已被调用特定次数,可以将其与.called(<number-of-calls-expected>)

    链接。
  2. 要测试未调用您的方法,您应该使用verifyNever(<your-method-with-expected-params>),这将验证您的方法未被调用

请确保传递给verifyverifyNever的方法都是Mockito所模拟的方法。