Mockito - 在空安全迁移后存根一个方法

Pab*_*ito 6 mockito dart flutter-test dart-null-safety

在空安全之前,我可以简单地模拟sendRequest(...)方法,如下所示:

 void stubBaseRepositorySendRequestResponse(String response) {
    when(baseRepository.sendRequest(onGetData: anyNamed('onGetData')))
        .thenAnswer((_) {
      return Future<String>.value(response);
    });
  }
Run Code Online (Sandbox Code Playgroud)

这个方法的签名是:

Future<T> sendRequest<T>({required Future<T> Function() onGetData})
Run Code Online (Sandbox Code Playgroud)

如何使用新的空安全版本的 mockito 做到这一点?我还能保持这个存根的通用特性并允许传入任何参数吗?

Pab*_*ito 6

这可以通过mocktail轻松完成。更容易,没有 mockito 所需的代码生成。

首先导入mocktail很重要:

import 'package:mocktail/mocktail.dart';
Run Code Online (Sandbox Code Playgroud)

然后创建一个我们想要模拟的类的模拟:

class MockBaseRepository extends Mock implements BaseRepository {}

void stubBaseRepositorySendRequestResponse(String response) {
when(() => baseRepository.sendRequest(
        onGetData: any(named: 'onGetData', that: isNotNull))).thenAnswer((_) {
      return Future<String>.value(response);
    });
  }
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说非常有效。谢谢你! (2认同)

ego*_*ego 5

在mockito空安全升级后更新存根:

为了概述该过程,需要生成一个存根类,这是使用build_runnerpackage.json 完成的。您将需要导入该类和存根所需的方法。

  1. 更新类 - 从存根定义中删除“Mock”,因为导入的存根类将以“Mock”开头,例如:

class MyClass extends Mock implements MyClassBase {}
Run Code Online (Sandbox Code Playgroud)

代替


class MockMyClass extends Mock implements MyClassBase {}
Run Code Online (Sandbox Code Playgroud)
  1. 在 main 之前添加@GenerateMocks([MockedClass])例如@GenerateMocks([MyClass])(它需要导入import 'package:mockito/annotations.dart';:)
  2. 安装build_runner
  3. 通过运行生成存根类

flutter pub run build_runner build --delete-conflicting-outputs

  1. 在测试文件中导入存根类,该类将在与测试文件相同的目录中生成,导入将类似于import '{TEST_FILE_NAME}.mocks.dart';. Generate(现在存根类可以使用与开头相同的名称Mock,例如MockMyClass
  2. 存根所需的方法,在调用/断言之前(提供参数和返回值):
    when(mockMyClass.someFancyMethod(any, any))
        .thenAnswer((_) => Future.value(null));
Run Code Online (Sandbox Code Playgroud)

聚苯乙烯

以这种方式模拟 NavigatorObserver 时遇到问题,我得到的错误:

The following MissingStubError was thrown building IconTheme(color: Color(0xdd000000)): 'navigator'
Run Code Online (Sandbox Code Playgroud)

存根navigatorNavigatorState没有帮助,我猜这与上下文传播有关。

我通过使用以下非空安全方式解决了这个问题,如mockito的空安全指南中所指定:

@GenerateMocks([], 
  customMocks: [
    MockSpec<NavigatorObserver>(returnNullOnMissingStub: true)
  ])
Run Code Online (Sandbox Code Playgroud)

在那次跑步之后

flutter pub run  build_runner build --delete-conflicting-outputs
Run Code Online (Sandbox Code Playgroud)

它将MockNavigatorObserver通过导入*.mocks.dart文件(如上所述)产生可用。当然,由于它是由mockito生成的,因此需要删除该类的任何自定义定义。