如何验证调用或不调用方法

How to verify to call or not to call a method

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 是否也被调用但出现错误:

Used on a non-mockito object

有没有可能用 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 方法时,您需要调用 mock

上的实际方法

尝试

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

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

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

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