diff --git a/packages/share/CHANGELOG.md b/packages/share/CHANGELOG.md index 20afdea9f054..87e941c7afd7 100644 --- a/packages/share/CHANGELOG.md +++ b/packages/share/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.1 + +* Migrate unit tests to sound null safety. + ## 2.0.0 * Migrate to null safety. diff --git a/packages/share/pubspec.yaml b/packages/share/pubspec.yaml index e8a116799433..dd82fb4926bf 100644 --- a/packages/share/pubspec.yaml +++ b/packages/share/pubspec.yaml @@ -2,7 +2,7 @@ name: share description: Flutter plugin for sharing content via the platform share UI, using the ACTION_SEND intent on Android and UIActivityViewController on iOS. homepage: https://github.com/flutter/plugins/tree/master/packages/share -version: 2.0.0 +version: 2.0.1 flutter: plugin: @@ -20,8 +20,6 @@ dependencies: sdk: flutter dev_dependencies: - test: ^1.16.3 - mockito: ^5.0.0-nullsafety.7 flutter_test: sdk: flutter integration_test: diff --git a/packages/share/test/share_test.dart b/packages/share/test/share_test.dart index d00867b19452..7e72fc4dc012 100644 --- a/packages/share/test/share_test.dart +++ b/packages/share/test/share_test.dart @@ -2,38 +2,33 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// @dart = 2.9 - import 'dart:io'; import 'dart:ui'; -import 'package:flutter_test/flutter_test.dart' show TestWidgetsFlutterBinding; -import 'package:mockito/mockito.dart'; -import 'package:share/share.dart'; -import 'package:test/test.dart'; - import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:share/share.dart'; void main() { - TestWidgetsFlutterBinding.ensureInitialized(); + TestWidgetsFlutterBinding.ensureInitialized(); // Required for MethodChannels - MockMethodChannel mockChannel; + late FakeMethodChannel fakeChannel; setUp(() { - mockChannel = MockMethodChannel(); - // Re-pipe to mockito for easier verifies. + fakeChannel = FakeMethodChannel(); + // Re-pipe to our fake to verify invocations. Share.channel.setMockMethodCallHandler((MethodCall call) async { // The explicit type can be void as the only method call has a return type of void. - await mockChannel.invokeMethod(call.method, call.arguments); + await fakeChannel.invokeMethod(call.method, call.arguments); }); }); test('sharing empty fails', () { expect( () => Share.share(''), - throwsA(const TypeMatcher()), + throwsA(isA()), ); - verifyZeroInteractions(mockChannel); + expect(fakeChannel.invocation, isNull); }); test('sharing origin sets the right params', () async { @@ -42,22 +37,28 @@ void main() { subject: 'some subject to share', sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0), ); - verify(mockChannel.invokeMethod('share', { - 'text': 'some text to share', - 'subject': 'some subject to share', - 'originX': 1.0, - 'originY': 2.0, - 'originWidth': 3.0, - 'originHeight': 4.0, - })); + + expect( + fakeChannel.invocation, + equals({ + 'share': { + 'text': 'some text to share', + 'subject': 'some subject to share', + 'originX': 1.0, + 'originY': 2.0, + 'originWidth': 3.0, + 'originHeight': 4.0, + } + }), + ); }); test('sharing empty file fails', () { expect( () => Share.shareFiles(['']), - throwsA(const TypeMatcher()), + throwsA(isA()), ); - verifyZeroInteractions(mockChannel); + expect(fakeChannel.invocation, isNull); }); test('sharing file sets correct mimeType', () async { @@ -65,11 +66,18 @@ void main() { final File file = File(path); try { file.createSync(); + await Share.shareFiles([path]); - verify(mockChannel.invokeMethod('shareFiles', { - 'paths': [path], - 'mimeTypes': ['image/png'], - })); + + expect( + fakeChannel.invocation, + equals({ + 'shareFiles': { + 'paths': [path], + 'mimeTypes': ['image/png'], + } + }), + ); } finally { file.deleteSync(); } @@ -80,15 +88,30 @@ void main() { final File file = File(path); try { file.createSync(); + await Share.shareFiles([path], mimeTypes: ['*/*']); - verify(mockChannel.invokeMethod('shareFiles', { - 'paths': [file.path], - 'mimeTypes': ['*/*'], - })); + + expect( + fakeChannel.invocation, + equals({ + 'shareFiles': { + 'paths': [file.path], + 'mimeTypes': ['*/*'], + } + }), + ); } finally { file.deleteSync(); } }); } -class MockMethodChannel extends Mock implements MethodChannel {} +class FakeMethodChannel extends Fake implements MethodChannel { + Map? invocation; + + @override + Future invokeMethod(String method, [dynamic arguments]) async { + this.invocation = {method: arguments}; + return null; + } +}