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

时间:2021-04-27 20:51:37

标签: dart mockito flutter-test dart-null-safety

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

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

这个方法的签名在哪里:

Future<T> sendRequest<T>({required Future<T> Function() onGetData})

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

2 个答案:

答案 0 :(得分:4)

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

先导入mocktail很重要:

import 'package:mocktail/mocktail.dart';

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

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);
    });
  }

答案 1 :(得分:0)

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

要概述该过程,需要生成一个存根类,这是使用 build_runner 包完成的。您将需要导入该类并存根所需的方法。

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

class MyClass extends Mock implements MyClassBase {}

代替


class MockMyClass extends Mock implements MyClassBase {}
  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));

PS

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

The following MissingStubError was thrown building IconTheme(color: Color(0xdd000000)): 'navigator'

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

我通过使用以下非空安全方式解决了这个问题,如 mockito's null-safety guideline 中所述:

@GenerateMocks([], 
  customMocks: [
    MockSpec<NavigatorObserver>(returnNullOnMissingStub: true)
  ])

在那之后运行

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

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