在空安全之前,我可以简单地模拟 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 做到这一点? 我还能保持这个存根的通用特性并允许传入任何参数吗?
答案 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
包完成的。您将需要导入该类并存根所需的方法。
class MyClass extends Mock implements MyClassBase {}
代替
class MockMyClass extends Mock implements MyClassBase {}
@GenerateMocks([MockedClass])
例如 @GenerateMocks([MyClass])
(它需要导入:import 'package:mockito/annotations.dart';
)flutter pub run build_runner build --delete-conflicting-outputs
import '{TEST_FILE_NAME}.mocks.dart';
。现在存根类可以使用与 Generate(
中以 Mock
开头的相同名称,例如 MockMyClass
when(mockMyClass.someFancyMethod(any, any))
.thenAnswer((_) => Future.value(null));
以这种方式模拟 NavigatorObserver 时遇到问题,我得到了错误:
The following MissingStubError was thrown building IconTheme(color: Color(0xdd000000)): 'navigator'
使用 navigator
对 NavigatorState
进行存根没有帮助,我猜这与上下文传播有关。
我通过使用以下非空安全方式解决了这个问题,如 mockito's null-safety guideline 中所述:
@GenerateMocks([],
customMocks: [
MockSpec<NavigatorObserver>(returnNullOnMissingStub: true)
])
在那之后运行
flutter pub run build_runner build --delete-conflicting-outputs
它会通过导入 MockNavigatorObserver
文件(如上所述)产生可用的 *.mocks.dart
。当然,由于它是由 mockito 生成的,因此需要删除该类的任何自定义定义。