June 30, 2023

Flutter testでMethod Channelをモックする

FlutterでUnit testを書く際に、MethodChannelを使用しているとこのようなエラーがでます。

package:flutter/src/services/platform_channel.dart 308:7  MethodChannel._invokeMethod

MissingPluginException(No implementation found for method updateBadgeCount on channel [author/package_name])

その場合は、MethodChannel自体をモックしてあげる必要があります。
やり方は簡単で、 TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger.setMockMethodCallHandler を呼び出してあげればよいです。
特になにもしなければnullで問題ないのですが、適宜変更してください。

TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
    .setMockMethodCallHandler(const MethodChannel([author/package_name]),
        (call) async {
      return null;
    });

これをsetUp() で呼べば、テスト時にで初期化してくれます。


void main() {

  setUp(() async {
    TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
        .setMockMethodCallHandler(const MethodChannel([author/package_name]),
            (call) async {
          return null;
        });
  });

  test('mock test', () async {
    ...
  });

}

Firebase

ちなみにFirebaseの場合は用意されたものがあります。

TestFirebaseCoreHostApi.setup(MockFirebaseApp());

https://github.com/firebase/flutterfire/blob/master/packages/firebase_core/firebase_core_platform_interface/lib/src/pigeon/mocks.dart

© AAkira 2023