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


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

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

  2. 若要测试你的方法是否未被调用,你应该使用verifyNever(<your-method-with-expected-params>)这将验证你的方法是否未被调用

确保传递给verifyverifyNever的方法都是被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 中已弃用引入用于验证无交互的别名

相关内容

  • 没有找到相关文章

最新更新