[null-safety] remove more usage of mockito from the framework tests (#62936)
diff --git a/packages/flutter/test/material/animated_icons_test.dart b/packages/flutter/test/material/animated_icons_test.dart index f013e72..8e8a738 100644 --- a/packages/flutter/test/material/animated_icons_test.dart +++ b/packages/flutter/test/material/animated_icons_test.dart
@@ -8,11 +8,75 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; +import '../flutter_test_alternative.dart' show Fake; import '../widgets/semantics_tester.dart'; -class MockCanvas extends Mock implements Canvas {} +class MockCanvas extends Fake implements Canvas { + Path capturedPath; + Paint capturedPaint; + + @override + void drawPath(Path path, Paint paint) { + capturedPath = path; + capturedPaint = paint; + } + + double capturedSx; + double capturedSy; + + @override + void scale(double sx, [double sy]) { + capturedSx = sx; + capturedSy = sy; + } + + final List<RecordedCanvasCall> invocations = <RecordedCanvasCall>[]; + + @override + void rotate(double radians) { + invocations.add(RecordedRotate(radians)); + } + + @override + void translate(double dx, double dy) { + invocations.add(RecordedTranslate(dx, dy)); + } +} + +@immutable +abstract class RecordedCanvasCall { + const RecordedCanvasCall(); +} + +class RecordedRotate extends RecordedCanvasCall { + const RecordedRotate(this.radians); + + final double radians; + + @override + bool operator ==(Object other) { + return other is RecordedRotate && other.radians == radians; + } + + @override + int get hashCode => radians.hashCode; +} + +class RecordedTranslate extends RecordedCanvasCall { + const RecordedTranslate(this.dx, this.dy); + + final double dx; + final double dy; + + @override + bool operator ==(Object other) { + return other is RecordedTranslate && other.dx == dx && other.dy == dy; + } + + @override + int get hashCode => hashValues(dx, dy); +} void main() { testWidgets('IconTheme color', (WidgetTester tester) async { @@ -33,7 +97,7 @@ final CustomPaint customPaint = tester.widget(find.byType(CustomPaint)); final MockCanvas canvas = MockCanvas(); customPaint.painter.paint(canvas, const Size(48.0, 48.0)); - verify(canvas.drawPath(any, argThat(hasColor(0xFF666666)))); + expect(canvas.capturedPaint, hasColor(0xFF666666)); }); testWidgets('IconTheme opacity', (WidgetTester tester) async { @@ -55,7 +119,7 @@ final CustomPaint customPaint = tester.widget(find.byType(CustomPaint)); final MockCanvas canvas = MockCanvas(); customPaint.painter.paint(canvas, const Size(48.0, 48.0)); - verify(canvas.drawPath(any, argThat(hasColor(0x80666666)))); + expect(canvas.capturedPaint, hasColor(0x80666666)); }); testWidgets('color overrides IconTheme color', (WidgetTester tester) async { @@ -77,7 +141,7 @@ final CustomPaint customPaint = tester.widget(find.byType(CustomPaint)); final MockCanvas canvas = MockCanvas(); customPaint.painter.paint(canvas, const Size(48.0, 48.0)); - verify(canvas.drawPath(any, argThat(hasColor(0xFF0000FF)))); + expect(canvas.capturedPaint, hasColor(0xFF0000FF)); }); testWidgets('IconTheme size', (WidgetTester tester) async { @@ -100,7 +164,8 @@ final MockCanvas canvas = MockCanvas(); customPaint.painter.paint(canvas, const Size(12.0, 12.0)); // arrow_menu default size is 48x48 so we expect it to be scaled by 0.25. - verify(canvas.scale(0.25, 0.25)); + expect(canvas.capturedSx, 0.25); + expect(canvas.capturedSy, 0.25); }); testWidgets('size overridesIconTheme size', (WidgetTester tester) async { @@ -124,7 +189,8 @@ final MockCanvas canvas = MockCanvas(); customPaint.painter.paint(canvas, const Size(12.0, 12.0)); // arrow_menu default size is 48x48 so we expect it to be scaled by 2. - verify(canvas.scale(2.0, 2.0)); + expect(canvas.capturedSx, 2); + expect(canvas.capturedSy, 2); }); testWidgets('Semantic label', (WidgetTester tester) async { @@ -165,9 +231,9 @@ final CustomPaint customPaint = tester.widget(find.byType(CustomPaint)); final MockCanvas canvas = MockCanvas(); customPaint.painter.paint(canvas, const Size(48.0, 48.0)); - verifyInOrder(<void>[ - canvas.rotate(math.pi), - canvas.translate(-48.0, -48.0), + expect(canvas.invocations, const <RecordedCanvasCall>[ + RecordedRotate(math.pi), + RecordedTranslate(-48, -48), ]); }); @@ -189,8 +255,7 @@ final CustomPaint customPaint = tester.widget(find.byType(CustomPaint)); final MockCanvas canvas = MockCanvas(); customPaint.painter.paint(canvas, const Size(48.0, 48.0)); - verifyNever(canvas.rotate(any)); - verifyNever(canvas.translate(any, any)); + expect(canvas.invocations, isEmpty); }); testWidgets('Inherited text direction overridden', (WidgetTester tester) async { @@ -212,9 +277,9 @@ final CustomPaint customPaint = tester.widget(find.byType(CustomPaint)); final MockCanvas canvas = MockCanvas(); customPaint.painter.paint(canvas, const Size(48.0, 48.0)); - verifyInOrder(<void>[ - canvas.rotate(math.pi), - canvas.translate(-48.0, -48.0), + expect(canvas.invocations, const <RecordedCanvasCall>[ + RecordedRotate(math.pi), + RecordedTranslate(-48, -48), ]); }); }
diff --git a/packages/flutter/test/widgets/custom_paint_test.dart b/packages/flutter/test/widgets/custom_paint_test.dart index 9060f19..dd4eb5e 100644 --- a/packages/flutter/test/widgets/custom_paint_test.dart +++ b/packages/flutter/test/widgets/custom_paint_test.dart
@@ -7,7 +7,8 @@ import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; + +import '../flutter_test_alternative.dart' show Fake; class TestCustomPainter extends CustomPainter { TestCustomPainter({ this.log, this.name }); @@ -39,9 +40,23 @@ }; } -class MockCanvas extends Mock implements Canvas {} +class MockCanvas extends Fake implements Canvas { + int saveCount = 0; + int saveCountDelta = 1; -class MockPaintingContext extends Mock implements PaintingContext {} + @override + int getSaveCount() { + return saveCount += saveCountDelta; + } + + @override + void save() { } +} + +class MockPaintingContext extends Fake implements PaintingContext { + @override + final MockCanvas canvas = MockCanvas(); +} void main() { testWidgets('Control test for custom painting', (WidgetTester tester) async { @@ -76,11 +91,8 @@ painter: TestCustomPainter(log: log), )); final RenderCustomPaint renderCustom = target.currentContext.findRenderObject() as RenderCustomPaint; - final Canvas canvas = MockCanvas(); - int saveCount = 0; - when(canvas.getSaveCount()).thenAnswer((_) => saveCount++); - final PaintingContext paintingContext = MockPaintingContext(); - when(paintingContext.canvas).thenReturn(canvas); + final MockPaintingContext paintingContext = MockPaintingContext(); + final MockCanvas canvas = paintingContext.canvas; FlutterError getError() { FlutterError error; @@ -104,7 +116,7 @@ ' matching call to restore().\n' )); - when(canvas.getSaveCount()).thenAnswer((_) => saveCount--); + canvas.saveCountDelta = -1; error = getError(); expect(error.toStringDeep(), equalsIgnoringHashCodes( 'FlutterError\n' @@ -117,11 +129,11 @@ ' saveLayer().\n' )); - when(canvas.getSaveCount()).thenAnswer((_) => saveCount += 2); + canvas.saveCountDelta = 2; error = getError(); expect(error.toStringDeep(), contains('2 more times')); - when(canvas.getSaveCount()).thenAnswer((_) => saveCount -= 2); + canvas.saveCountDelta = -2; error = getError(); expect(error.toStringDeep(), contains('2 more times')); });
diff --git a/packages/flutter/test/widgets/routes_test.dart b/packages/flutter/test/widgets/routes_test.dart index a98eac4..2ef2cce 100644 --- a/packages/flutter/test/widgets/routes_test.dart +++ b/packages/flutter/test/widgets/routes_test.dart
@@ -11,8 +11,8 @@ import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; +import '../flutter_test_alternative.dart' show Fake; import 'semantics_tester.dart'; final List<String> results = <String>[]; @@ -452,60 +452,64 @@ group('PageRouteObserver', () { test('calls correct listeners', () { final RouteObserver<PageRoute<dynamic>> observer = RouteObserver<PageRoute<dynamic>>(); - final RouteAware pageRouteAware1 = MockRouteAware(); + final MockRouteAware pageRouteAware1 = MockRouteAware(); final MockPageRoute route1 = MockPageRoute(); observer.subscribe(pageRouteAware1, route1); - verify(pageRouteAware1.didPush()).called(1); + expect(pageRouteAware1.didPushCount, 1); - final RouteAware pageRouteAware2 = MockRouteAware(); + final MockRouteAware pageRouteAware2 = MockRouteAware(); final MockPageRoute route2 = MockPageRoute(); observer.didPush(route2, route1); - verify(pageRouteAware1.didPushNext()).called(1); + expect(pageRouteAware1.didPushNextCount, 1); observer.subscribe(pageRouteAware2, route2); - verify(pageRouteAware2.didPush()).called(1); + expect(pageRouteAware2.didPushCount, 1); observer.didPop(route2, route1); - verify(pageRouteAware2.didPop()).called(1); - verify(pageRouteAware1.didPopNext()).called(1); + expect(pageRouteAware2.didPopCount, 1); + expect(pageRouteAware1.didPopNextCount, 1); }); test('does not call listeners for non-PageRoute', () { final RouteObserver<PageRoute<dynamic>> observer = RouteObserver<PageRoute<dynamic>>(); - final RouteAware pageRouteAware = MockRouteAware(); + final MockRouteAware pageRouteAware = MockRouteAware(); final MockPageRoute pageRoute = MockPageRoute(); final MockRoute route = MockRoute(); observer.subscribe(pageRouteAware, pageRoute); - verify(pageRouteAware.didPush()); + expect(pageRouteAware.didPushCount, 1); observer.didPush(route, pageRoute); observer.didPop(route, pageRoute); - verifyNoMoreInteractions(pageRouteAware); + + expect(pageRouteAware.didPushCount, 1); + expect(pageRouteAware.didPopCount, 0); }); test('does not call listeners when already subscribed', () { final RouteObserver<PageRoute<dynamic>> observer = RouteObserver<PageRoute<dynamic>>(); - final RouteAware pageRouteAware = MockRouteAware(); + final MockRouteAware pageRouteAware = MockRouteAware(); final MockPageRoute pageRoute = MockPageRoute(); observer.subscribe(pageRouteAware, pageRoute); observer.subscribe(pageRouteAware, pageRoute); - verify(pageRouteAware.didPush()).called(1); + expect(pageRouteAware.didPushCount, 1); }); test('does not call listeners when unsubscribed', () { final RouteObserver<PageRoute<dynamic>> observer = RouteObserver<PageRoute<dynamic>>(); - final RouteAware pageRouteAware = MockRouteAware(); + final MockRouteAware pageRouteAware = MockRouteAware(); final MockPageRoute pageRoute = MockPageRoute(); final MockPageRoute nextPageRoute = MockPageRoute(); observer.subscribe(pageRouteAware, pageRoute); observer.subscribe(pageRouteAware, nextPageRoute); - verify(pageRouteAware.didPush()).called(2); + expect(pageRouteAware.didPushCount, 2); observer.unsubscribe(pageRouteAware); observer.didPush(nextPageRoute, pageRoute); observer.didPop(nextPageRoute, pageRoute); - verifyNoMoreInteractions(pageRouteAware); + + expect(pageRouteAware.didPushCount, 2); + expect(pageRouteAware.didPopCount, 0); }); }); @@ -1790,11 +1794,36 @@ final Duration reverseTransitionDuration; } -class MockPageRoute extends Mock implements PageRoute<dynamic> { } +class MockPageRoute extends Fake implements PageRoute<dynamic> { } -class MockRoute extends Mock implements Route<dynamic> { } +class MockRoute extends Fake implements Route<dynamic> { } -class MockRouteAware extends Mock implements RouteAware { } +class MockRouteAware extends Fake implements RouteAware { + int didPushCount = 0; + int didPushNextCount = 0; + int didPopCount = 0; + int didPopNextCount = 0; + + @override + void didPush() { + didPushCount += 1; + } + + @override + void didPushNext() { + didPushNextCount += 1; + } + + @override + void didPop() { + didPopCount += 1; + } + + @override + void didPopNext() { + didPopNextCount += 1; + } +} class TestPageRouteBuilder extends PageRouteBuilder<void> { TestPageRouteBuilder({RoutePageBuilder pageBuilder}) : super(pageBuilder: pageBuilder);