Testing 带Dart函数的Mockito

Testing 带Dart函数的Mockito,testing,dart,mockito,flutter,flutter-test,Testing,Dart,Mockito,Flutter,Flutter Test,我有一个我想模拟的方法,但是当我尝试验证这个方法的调用时。我得到一个错误,上面写着: Used on a non-mockito object 以下是简化代码: test('test',() { MockReducer reducer = new MockReducer(); verify(reducer).called(0); }); class MockReducer extends Mock { call(state, action) => state; } 为什么

我有一个我想模拟的方法,但是当我尝试验证这个方法的调用时。我得到一个错误,上面写着:

Used on a non-mockito object
以下是简化代码:

test('test',() {
  MockReducer reducer = new MockReducer();
  verify(reducer).called(0);
});

class MockReducer extends Mock {
  call(state, action) => state;
}

为什么我不能这样做呢?

我想你有三个问题:

  • Mockito仅适用于类,而不适用于函数(请参阅)。您有一些选项:创建函数的测试实现,或者对于
    redux.dart
    ,您可以实现
    ReducerClass
    (通过实现
    调用
    充当
    Reducer
    函数)
  • 您需要验证被调用的方法,而不是整个模拟类
  • 必须使用
    verifyNever
    而不是
    verify(X)。调用(0)
  • 工作示例:

    class MockReducer extends Mock implements ReducerClass {}
    
    main() {
      test('should be able to mock a reducer', () {
        final reducer = new MockReducer();
    
        verifyNever(reducer.call(any, any));
      });
    }
    

    如果您只想创建一个模拟函数作为小部件测试环境上的onTap使用,可以使用mockito执行以下操作:

    abstract class MyFunction {
      void call();
    }
    
    class MyFunctionMock extends Mock implements MyFunction {}
    
    测试:


    根据您提供的链接,我只是简单地创建了一个新函数,该函数与我在没有Mockito的情况下所做的完全相同。这似乎是最干净的解决办法。谢谢您甚至可以删除
    。调用
    。这很有效!我以前尝试过在测试环境中使用模拟函数,这是通过构造函数模拟和测试传递给小部件的方法的最简单、最干净的方法。
    
    void main() {
     final mock = MyFunctionMock();
     ...
    
      // This is inside the the testWidgets callback 
      await tester.pumpWidget(
              widgetToBeTested(
                item: registeredListItem,
                onTap: mock,
              ),
            );
    
      //Logic to tap the widgetToBeTested
    
      verify(mock()).called(1);
    
    }