Dart Mockito - 如何在保留原始实现的同时进行模拟?

Val*_*nal 7 mocking mockito dart flutter flutter-test

我想在我的 flutter 应用程序上编写一些集成测试。为此,我使用Mockito包。


我想模拟一个类,但也保留其原始实现。

假设我有一个模型MyModel(可能很复杂)和一个使用它的小部件。

class MyModel {
    void complexCallback() {}
}

class MyWidget extends StatelessWidget {
    const MyWidget(this.model);
    
    final MyModel model;
    
    @override
    Widget build(BuildContext context) {}
}
Run Code Online (Sandbox Code Playgroud)

我希望能够在测试中模拟MyModel以验证回调函数是否被调用(例如,点击按钮后),但我也希望MyModel表现得像它应该的那样,以验证屏幕上的影响(重建例如具有不同值的小部件)。

testWidget('Test MyModel and MyWidget', (WidgetTester tester) async {
    final model = MyModel(); // <- Cannot verify here because it is not mocked, if I replace by MockMyModel or FakeMyModel, the button doesn't do anything anymore
    await tester.pumpWidget(MyWidget(model));

    await tester.tap(find.byType(IconButton));  // <- Tap on a button for example

    expect(find.text('Button tapped'), findsOneWidget); // <- Test change on the screen - works with MyModel but not with MockMyModel and FakeMyModel
    expect(verify(model.complexCallback(captureAny)).captured, ['buttonID']); // <- Test callback function - works with MockMyModel or FakeMyModel but not with MyModel
});
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,如果我按原样运行测试,MyModel则不会被嘲笑,因此verify无法工作。

如果我使用MockFake来自Mockito来模拟它:

class MockMyModel extends Mock implements MyModel {}
Run Code Online (Sandbox Code Playgroud)

或者

class FakeMyModel extends Fake implements MyModel {}
Run Code Online (Sandbox Code Playgroud)

我将失去执行MyModel,然后,点击后屏幕不会改变。而且我真的不想重写所有MyModel可能相当大和复杂的方法。另外,如果我重写它,我将测试我重写的实现,而不是原始的实现,这并不是真正的重点。


知道我怎样才能实现它吗?