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

cgfeq70w  于 2022-11-08  发布在  其他
关注(0)|答案(3)|浏览(667)
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对象
有没有可能和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);
  }

}
6yjfywim

6yjfywim1#

当调用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);

});

如果一次都没有呼叫方法,测试就会失败。

13z8s7eq

13z8s7eq2#

Mockito提供了对这两种类型的本机支持
1.要测试您的方法是否至少被调用过一次,您可以使用verify(<your-method-with-expected-params>),这将验证您的方法是否被调用过(无论调用多少次)。要验证它是否被调用过特定的次数,您可以使用.called(<number-of-calls-expected>)将其链接起来
1.要测试方法是否未被调用,应使用verifyNever(<your-method-with-expected-params>),这将验证方法是否未被调用
请确保传递给verifyverifyNever的方法是Mockito已Mocked的方法。

gmxoilav

gmxoilav3#

您可以使用从不和验证零交互

//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中将verifyZeroInteractions标记为已弃用,这也为verifyNoInteractions引入了别名

相关问题