在空安全之前,我可以简单地模拟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
包完成的。您将需要导入该类和存根所需的方法。
- 更新类-从存根定义中删除'Mock',因为导入的存根类将以'Mock]开头,例如:
class MyClass extends Mock implements MyClassBase {}
而不是
class MockMyClass extends Mock implements MyClassBase {}
- 在main之前添加
@GenerateMocks([MockedClass])
,例如@GenerateMocks([MyClass])
(需要导入:import 'package:mockito/annotations.dart';
( - 安装build_runner
- 通过运行生成存根类
flutter pub run build_runner build --delete-conflicting-outputs
- 在测试文件中导入存根类,该类将在与测试文件相同的目录中生成,导入将类似于
import '{TEST_FILE_NAME}.mocks.dart';
。现在,存根类可用,其名称与Generate(
中给定的名称相同,以Mock
开头,例如MockMyClass
- Stub必需的方法,在调用/断言之前(提供参数和返回值(:
when(mockMyClass.someFancyMethod(any, any))
.thenAnswer((_) => Future.value(null));
ps
以这种方式嘲笑NavigatorObserver时遇到了问题,我得到的错误是:
The following MissingStubError was thrown building IconTheme(color: Color(0xdd000000)): 'navigator'
将navigator
与NavigatorState
存根并没有帮助,我想这与上下文传播有关。
我通过使用以下非零安全方式解决了这个问题,正如mockito的零安全指南中所规定的那样:
@GenerateMocks([],
customMocks: [
MockSpec<NavigatorObserver>(returnNullOnMissingStub: true)
])
之后运行
flutter pub run build_runner build --delete-conflicting-outputs
它将通过导入*.mocks.dart
文件(如上所述(生成可用的MockNavigatorObserver
。当然,由于它是由mockito生成的,因此需要删除该类的任何自定义定义。