前提・実現したいこと
flutter_udidを使ったメソッドをモック化する方法をご教示いただきたいです。
後述するソースコードのcreateInfoメソッドをテストしたいと思っています。
FlutterUdid.udidをラップしたgenerateIdというメソッドがあり、それはcreateInfoの中で実行されます。
よろしくお願いします。
発生している問題・エラーメッセージ
00:03 +0 -1: createInfo [E] Null check operator used on a null value package:flutter/src/services/platform_channel.dart 142:86 MethodChannel.binaryMessenger package:flutter/src/services/platform_channel.dart 148:36 MethodChannel._invokeMethod package:flutter/src/services/platform_channel.dart 331:12 MethodChannel.invokeMethod package:flutter_udid/flutter_udid.dart 15:40 FlutterUdid.udid package:question/udid_repo.dart 17:30 UdidRepo.generateId package:question/udid_repo.dart 21:22 UdidRepo.createInfo test/udid_repo_test.dart 6:38 main.<fn> test/udid_repo_test.dart 5:22 main.<fn> 00:03 +0 -1: Some tests failed.
Null check operator used on a null value
このエラーが出ないようにFlutterUdid.udidをモック化して決まった値を返させたいと考えています。
該当のソースコード
udid_repo.dart (テストしたいクラス)
dart
1import 'dart:convert'; 2 3import 'package:flutter_udid/flutter_udid.dart'; 4 5class UdidRepo { 6 Future<String> generateId() async { 7 return await FlutterUdid.udid; 8 } 9 10 Future<String> createInfo() async { 11 var udid = await generateId(); 12 return 'udid: $udid'; 13 } 14}
udid_repo_test.dart
dart
1import 'package:flutter_test/flutter_test.dart'; 2import 'package:question/udid_repo.dart'; 3 4void main() { 5 test('createInfo', () async { 6 var ret = await UdidRepo().createInfo(); 7 expect(ret, 'udid: hogehoge'); 8 }); 9}
試したこと
- FlutterUdidをモック化
FlutterUdidをモック化してみましたが、FlutterUdid.udidはstaticメソッドのゲッターなので、モックオブジェクトを使えるようにudid_repo.dartにセッターを定義しても使用できませんでした。
- UdidRepoクラスのgenerateIdメソッドをモック化
generateIdメソッドをモック化してもcreateInfoメソッドはモックではない本来のメソッドが動作してしまい、期待動作しませんでした。
udid_repo_test.dart (generateIdメソッドをモック化)
dart
1import 'package:flutter_test/flutter_test.dart'; 2import 'package:mockito/annotations.dart'; 3import 'package:mockito/mockito.dart'; 4import 'package:question/udid_repo.dart'; 5 6import 'udid_repo_test.mocks.dart'; 7 8([UdidRepo]) 9void main() { 10 test('createInfo', () async { 11 var _mockUdidRepo = MockUdidRepo(); 12 when(_mockUdidRepo.generateId()) 13 .thenAnswer((_) => Future<String>.value('hogehoge')); 14 15 var ret = await UdidRepo().createInfo(); 16 expect(ret, 'udid: hogehoge'); 17 }); 18}
@GenerateMocksアノテーションを打った後、下記コマンドでモックファイルを作成済みです。
flutter pub pub run build_runner build
補足情報(FW/ツールのバージョンなど)
- Flutter: 2.2.3
- Dart: 2.13.4
- mockito: 5.0.10
- build_runner: 2.0.6
あなたの回答
tips
プレビュー