Mockito-stub是null安全迁移后的一个方法



在空安全之前,我可以简单地模拟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的新null安全版本来实现这一点?我还能保持这个存根的泛型字符并允许传入任何参数吗?

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

重要的是首先导入模拟尾部:

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

mockito null安全升级后更新存根:

为了概述这个过程,需要生成一个存根类,这是使用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. Stub必需的方法,在调用/断言之前(提供参数和返回值(:
when(mockMyClass.someFancyMethod(any, any))
.thenAnswer((_) => Future.value(null));

ps

以这种方式嘲笑NavigatorObserver时遇到了问题,我得到的错误是:

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

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

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

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

之后运行

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

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

最新更新