在做Flutter单元测试的时候,有时候我们会遇到Flutter Widget的某个方法调用了Platform的方法,这时候就需要Mock这个MethodChannel来消除依赖,否则测试用例执行到Channel的方法就会抛出异常。
在测试环境下,Flutter给我们提供了TestDefaultBinaryMessenger
来拦截MethodChannel,所以我们需要先获取到它。
/// 依赖WidgetTester,需要在测试用例中获取
testWidgets('one test case', (widgetTester) async {
final TestDefaultBinaryMessenger messenger =
widgetTester.binding.defaultBinaryMessenger;
});
/// 通过单例获取,写在setUp中可以在所有测试用例执行前运行
setUp(() {
final TestDefaultBinaryMessenger messenger =
TestDefaultBinaryMessengerBinding.instance!.defaultBinaryMessenger;
}
• Flutter调用Platform方法:
• TestDefaultBinaryMessenger#setMockMethodCallHandler
,第一个参数是需要拦截的MethodChannel,第二个参数是Function表示Mock调用。
• TestDefaultBinaryMessenger#allMessagesHandler
,和上面类似,但这里是拦截所有的MethodChannel,并且,此项设置后,setMockMethodCallHandler将不生效。
• Platform调用Flutter方法:
• TestDefaultBinaryMessenger#handlePlatformMessage
,第一个参数是MethodChannel名字,第二个参数是传给Flutter编码后的MethodCall,第三个参数是Flutter处理后结果的回调。