Change async stubbing to use thenAnswer. (#13521)

* Change async stubbing to use thenAnswer.

Mockito now prohibits calling thenReturn with Futures and Streams. dart-lang/mockito#79

* Update all Mockito deps to 3.0.0.

* Revert "Update all Mockito deps to 3.0.0."

This reverts commit e8ab9d37c33d3d7fe384abde64ea5b4d72623c75.

I did not correctly update the mockito dep, and there's no easy way to update to 3.0 alpha right now.

* Change thenAnswer((_) => to thenAnswer((invocation) =>

* Add Invocation type to thenAnswer lambdas
diff --git a/packages/flutter_tools/test/base/io_test.dart b/packages/flutter_tools/test/base/io_test.dart
index 096eb79..506be74 100644
--- a/packages/flutter_tools/test/base/io_test.dart
+++ b/packages/flutter_tools/test/base/io_test.dart
@@ -19,7 +19,7 @@
       final ProcessSignal signalUnderTest = new ProcessSignal(mockSignal);
       final StreamController<io.ProcessSignal> controller = new StreamController<io.ProcessSignal>();
 
-      when(mockSignal.watch()).thenReturn(controller.stream);
+      when(mockSignal.watch()).thenAnswer((Invocation invocation) => controller.stream);
       controller.add(mockSignal);
 
       expect(signalUnderTest, await signalUnderTest.watch().first);
@@ -31,4 +31,4 @@
   });
 }
 
-class MockIoProcessSignal extends Mock implements io.ProcessSignal {}
\ No newline at end of file
+class MockIoProcessSignal extends Mock implements io.ProcessSignal {}
diff --git a/packages/flutter_tools/test/commands/drive_test.dart b/packages/flutter_tools/test/commands/drive_test.dart
index b6d0e8b..1e65604 100644
--- a/packages/flutter_tools/test/commands/drive_test.dart
+++ b/packages/flutter_tools/test/commands/drive_test.dart
@@ -279,7 +279,8 @@
       testUsingContext('uses existing simulator', () async {
         withMockDevice();
         when(mockDevice.name).thenReturn('mock-simulator');
-        when(mockDevice.isLocalEmulator).thenReturn(new Future<bool>.value(true));
+        when(mockDevice.isLocalEmulator)
+            .thenAnswer((Invocation invocation) => new Future<bool>.value(true));
 
         final Device device = await findTargetDevice();
         expect(device.name, 'mock-simulator');
diff --git a/packages/flutter_tools/test/compile_test.dart b/packages/flutter_tools/test/compile_test.dart
index 500bc20..4a0e914 100644
--- a/packages/flutter_tools/test/compile_test.dart
+++ b/packages/flutter_tools/test/compile_test.dart
@@ -27,21 +27,24 @@
       mockFrontendServerStdIn = new MockStdIn();
       mockFrontendServerStdErr = new MockStream();
 
-      when(mockFrontendServer.stderr).thenReturn(mockFrontendServerStdErr);
+      when(mockFrontendServer.stderr)
+          .thenAnswer((Invocation invocation) => mockFrontendServerStdErr);
       final StreamController<String> stdErrStreamController = new StreamController<String>();
       when(mockFrontendServerStdErr.transform<String>(any)).thenReturn(stdErrStreamController.stream);
       when(mockFrontendServer.stdin).thenReturn(mockFrontendServerStdIn);
-      when(mockProcessManager.start(any)).thenReturn(new Future<Process>.value(mockFrontendServer));
+      when(mockProcessManager.start(any)).thenAnswer(
+          (Invocation invocation) => new Future<Process>.value(mockFrontendServer));
       when(mockFrontendServer.exitCode).thenReturn(0);
     });
 
     testUsingContext('single dart successful compilation', () async {
       final BufferLogger logger = context[Logger];
-      when(mockFrontendServer.stdout).thenReturn(new Stream<List<int>>.fromFuture(
-        new Future<List<int>>.value(UTF8.encode(
-          'result abc\nline1\nline2\nabc /path/to/main.dart.dill'
-        ))
-      ));
+      when(mockFrontendServer.stdout)
+          .thenAnswer((Invocation invocation) => new Stream<List<int>>.fromFuture(
+            new Future<List<int>>.value(UTF8.encode(
+              'result abc\nline1\nline2\nabc /path/to/main.dart.dill'
+            ))
+          ));
       final String output = await compile(sdkRoot: '/path/to/sdkroot',
         mainPath: '/path/to/main.dart'
       );
@@ -55,11 +58,12 @@
     testUsingContext('single dart failed compilation', () async {
       final BufferLogger logger = context[Logger];
 
-      when(mockFrontendServer.stdout).thenReturn(new Stream<List<int>>.fromFuture(
-        new Future<List<int>>.value(UTF8.encode(
-          'result abc\nline1\nline2\nabc'
-        ))
-      ));
+      when(mockFrontendServer.stdout)
+          .thenAnswer((Invocation invocation) => new Stream<List<int>>.fromFuture(
+            new Future<List<int>>.value(UTF8.encode(
+              'result abc\nline1\nline2\nabc'
+            ))
+          ));
 
       final String output = await compile(sdkRoot: '/path/to/sdkroot',
         mainPath: '/path/to/main.dart'
@@ -88,12 +92,14 @@
       mockFrontendServerStdErr = new MockStream();
 
       when(mockFrontendServer.stdin).thenReturn(mockFrontendServerStdIn);
-      when(mockFrontendServer.stderr).thenReturn(mockFrontendServerStdErr);
+      when(mockFrontendServer.stderr)
+          .thenAnswer((Invocation invocation) => mockFrontendServerStdErr);
       stdErrStreamController = new StreamController<String>();
-      when(mockFrontendServerStdErr.transform<String>(any)).thenReturn(stdErrStreamController.stream);
+      when(mockFrontendServerStdErr.transform<String>(any))
+          .thenAnswer((Invocation invocation) => stdErrStreamController.stream);
 
-      when(mockProcessManager.start(any)).thenReturn(
-          new Future<Process>.value(mockFrontendServer)
+      when(mockProcessManager.start(any)).thenAnswer(
+          (Invocation invocation) => new Future<Process>.value(mockFrontendServer)
       );
       when(mockFrontendServer.exitCode).thenReturn(0);
     });
@@ -101,11 +107,12 @@
     testUsingContext('single dart compile', () async {
       final BufferLogger logger = context[Logger];
 
-      when(mockFrontendServer.stdout).thenReturn(new Stream<List<int>>.fromFuture(
-        new Future<List<int>>.value(UTF8.encode(
-          'result abc\nline1\nline2\nabc /path/to/main.dart.dill'
-        ))
-      ));
+      when(mockFrontendServer.stdout)
+          .thenAnswer((Invocation invocation) => new Stream<List<int>>.fromFuture(
+            new Future<List<int>>.value(UTF8.encode(
+              'result abc\nline1\nline2\nabc /path/to/main.dart.dill'
+            ))
+          ));
 
       final String output = await generator.recompile(
         '/path/to/main.dart', null /* invalidatedFiles */
@@ -122,7 +129,8 @@
       final BufferLogger logger = context[Logger];
 
       final StreamController<List<int>> streamController = new StreamController<List<int>>();
-      when(mockFrontendServer.stdout).thenReturn(streamController.stream);
+      when(mockFrontendServer.stdout)
+          .thenAnswer((Invocation invocation) => streamController.stream);
       streamController.add(UTF8.encode('result abc\nline0\nline1\nabc /path/to/main.dart.dill\n'));
       await generator.recompile('/path/to/main.dart', null /* invalidatedFiles */);
       expect(mockFrontendServerStdIn.getAndClear(), 'compile /path/to/main.dart\n');
@@ -144,7 +152,8 @@
       final BufferLogger logger = context[Logger];
 
       final StreamController<List<int>> streamController = new StreamController<List<int>>();
-      when(mockFrontendServer.stdout).thenReturn(streamController.stream);
+      when(mockFrontendServer.stdout)
+          .thenAnswer((Invocation invocation) => streamController.stream);
       streamController.add(UTF8.encode(
         'result abc\nline0\nline1\nabc /path/to/main.dart.dill\n'
       ));
diff --git a/packages/flutter_tools/test/ios/code_signing_test.dart b/packages/flutter_tools/test/ios/code_signing_test.dart
index 1432e4e..3e701cc 100644
--- a/packages/flutter_tools/test/ios/code_signing_test.dart
+++ b/packages/flutter_tools/test/ios/code_signing_test.dart
@@ -120,15 +120,16 @@
 
       when(mockProcessManager.start(
         argThat(contains('openssl')), environment: any, workingDirectory: any,
-      )).thenReturn(new Future<Process>.value(mockProcess));
+      )).thenAnswer((Invocation invocation) => new Future<Process>.value(mockProcess));
 
       when(mockProcess.stdin).thenReturn(mockStdIn);
-      when(mockProcess.stdout).thenReturn(new Stream<List<int>>.fromFuture(
-        new Future<List<int>>.value(UTF8.encode(
-          'subject= /CN=iPhone Developer: Profile 1 (1111AAAA11)/OU=3333CCCC33/O=My Team/C=US'
-        ))
-      ));
-      when(mockProcess.stderr).thenReturn(mockStdErr);
+      when(mockProcess.stdout)
+          .thenAnswer((Invocation invocation) => new Stream<List<int>>.fromFuture(
+            new Future<List<int>>.value(UTF8.encode(
+              'subject= /CN=iPhone Developer: Profile 1 (1111AAAA11)/OU=3333CCCC33/O=My Team/C=US'
+            ))
+          ));
+      when(mockProcess.stderr).thenAnswer((Invocation invocation) => mockStdErr);
       when(mockProcess.exitCode).thenReturn(0);
 
       final String developmentTeam = await getCodeSigningIdentityDevelopmentTeam(iosApp: app);
@@ -178,15 +179,16 @@
 
       when(mockProcessManager.start(
         argThat(contains('openssl')), environment: any, workingDirectory: any,
-      )).thenReturn(new Future<Process>.value(mockOpenSslProcess));
+      )).thenAnswer((Invocation invocation) => new Future<Process>.value(mockOpenSslProcess));
 
       when(mockOpenSslProcess.stdin).thenReturn(mockOpenSslStdIn);
-      when(mockOpenSslProcess.stdout).thenReturn(new Stream<List<int>>.fromFuture(
-        new Future<List<int>>.value(UTF8.encode(
-          'subject= /CN=iPhone Developer: Profile 3 (3333CCCC33)/OU=4444DDDD44/O=My Team/C=US'
-        ))
-      ));
-      when(mockOpenSslProcess.stderr).thenReturn(mockOpenSslStdErr);
+      when(mockOpenSslProcess.stdout)
+          .thenAnswer((Invocation invocation) => new Stream<List<int>>.fromFuture(
+            new Future<List<int>>.value(UTF8.encode(
+              'subject= /CN=iPhone Developer: Profile 3 (3333CCCC33)/OU=4444DDDD44/O=My Team/C=US'
+            ))
+          ));
+      when(mockOpenSslProcess.stderr).thenAnswer((Invocation invocation) => mockOpenSslStdErr);
       when(mockOpenSslProcess.exitCode).thenReturn(0);
 
       final String developmentTeam = await getCodeSigningIdentityDevelopmentTeam(iosApp: app);
@@ -247,15 +249,16 @@
 
       when(mockProcessManager.start(
         argThat(contains('openssl')), environment: any, workingDirectory: any,
-      )).thenReturn(new Future<Process>.value(mockOpenSslProcess));
+      )).thenAnswer((Invocation invocation) => new Future<Process>.value(mockOpenSslProcess));
 
       when(mockOpenSslProcess.stdin).thenReturn(mockOpenSslStdIn);
-      when(mockOpenSslProcess.stdout).thenReturn(new Stream<List<int>>.fromFuture(
-        new Future<List<int>>.value(UTF8.encode(
-          'subject= /CN=iPhone Developer: Profile 1 (1111AAAA11)/OU=5555EEEE55/O=My Team/C=US'
-        )),
-      ));
-      when(mockOpenSslProcess.stderr).thenReturn(mockOpenSslStdErr);
+      when(mockOpenSslProcess.stdout)
+          .thenAnswer((Invocation invocation) => new Stream<List<int>>.fromFuture(
+            new Future<List<int>>.value(UTF8.encode(
+              'subject= /CN=iPhone Developer: Profile 1 (1111AAAA11)/OU=5555EEEE55/O=My Team/C=US'
+            )),
+          ));
+      when(mockOpenSslProcess.stderr).thenAnswer((Invocation invocation) => mockOpenSslStdErr);
       when(mockOpenSslProcess.exitCode).thenReturn(0);
 
       final String developmentTeam = await getCodeSigningIdentityDevelopmentTeam(iosApp: app, usesTerminalUi: false);
@@ -308,15 +311,16 @@
 
       when(mockProcessManager.start(
         argThat(contains('openssl')), environment: any, workingDirectory: any,
-      )).thenReturn(new Future<Process>.value(mockOpenSslProcess));
+      )).thenAnswer((Invocation invocation) => new Future<Process>.value(mockOpenSslProcess));
 
       when(mockOpenSslProcess.stdin).thenReturn(mockOpenSslStdIn);
-      when(mockOpenSslProcess.stdout).thenReturn(new Stream<List<int>>.fromFuture(
-        new Future<List<int>>.value(UTF8.encode(
-          'subject= /CN=iPhone Developer: Profile 3 (3333CCCC33)/OU=4444DDDD44/O=My Team/C=US'
-        ))
-      ));
-      when(mockOpenSslProcess.stderr).thenReturn(mockOpenSslStdErr);
+      when(mockOpenSslProcess.stdout)
+          .thenAnswer((Invocation invocation) => new Stream<List<int>>.fromFuture(
+            new Future<List<int>>.value(UTF8.encode(
+              'subject= /CN=iPhone Developer: Profile 3 (3333CCCC33)/OU=4444DDDD44/O=My Team/C=US'
+            ))
+          ));
+      when(mockOpenSslProcess.stderr).thenAnswer((Invocation invocation) => mockOpenSslStdErr);
       when(mockOpenSslProcess.exitCode).thenReturn(0);
       when(mockConfig.getValue('ios-signing-cert')).thenReturn('iPhone Developer: Profile 3 (3333CCCC33)');
 
@@ -376,15 +380,16 @@
 
       when(mockProcessManager.start(
         argThat(contains('openssl')), environment: any, workingDirectory: any,
-      )).thenReturn(new Future<Process>.value(mockOpenSslProcess));
+      )).thenAnswer((Invocation invocation) => new Future<Process>.value(mockOpenSslProcess));
 
       when(mockOpenSslProcess.stdin).thenReturn(mockOpenSslStdIn);
-      when(mockOpenSslProcess.stdout).thenReturn(new Stream<List<int>>.fromFuture(
-        new Future<List<int>>.value(UTF8.encode(
-          'subject= /CN=iPhone Developer: Profile 3 (3333CCCC33)/OU=4444DDDD44/O=My Team/C=US'
-        ))
-      ));
-      when(mockOpenSslProcess.stderr).thenReturn(mockOpenSslStdErr);
+      when(mockOpenSslProcess.stdout)
+          .thenAnswer((Invocation invocation) => new Stream<List<int>>.fromFuture(
+            new Future<List<int>>.value(UTF8.encode(
+              'subject= /CN=iPhone Developer: Profile 3 (3333CCCC33)/OU=4444DDDD44/O=My Team/C=US'
+            ))
+          ));
+      when(mockOpenSslProcess.stderr).thenAnswer((Invocation invocation) => mockOpenSslStdErr);
       when(mockOpenSslProcess.exitCode).thenReturn(0);
       when(mockConfig.getValue('ios-signing-cert')).thenReturn('iPhone Developer: Invalid Profile');
 
diff --git a/packages/flutter_tools/test/ios/devices_test.dart b/packages/flutter_tools/test/ios/devices_test.dart
index e589c1c..61b3356 100644
--- a/packages/flutter_tools/test/ios/devices_test.dart
+++ b/packages/flutter_tools/test/ios/devices_test.dart
@@ -44,7 +44,8 @@
 
     testUsingContext('returns no devices if none are attached', () async {
       when(iMobileDevice.isInstalled).thenReturn(true);
-      when(iMobileDevice.getAvailableDeviceIDs()).thenReturn(new Future<String>.value(''));
+      when(iMobileDevice.getAvailableDeviceIDs())
+          .thenAnswer((Invocation invocation) => new Future<String>.value(''));
       final List<IOSDevice> devices = await IOSDevice.getAttachedDevices();
       expect(devices, isEmpty);
     }, overrides: <Type, Generator>{
@@ -53,7 +54,8 @@
 
     testUsingContext('returns attached devices', () async {
       when(iMobileDevice.isInstalled).thenReturn(true);
-      when(iMobileDevice.getAvailableDeviceIDs()).thenReturn(new Future<String>.value('''
+      when(iMobileDevice.getAvailableDeviceIDs())
+          .thenAnswer((Invocation invocation) => new Future<String>.value('''
 98206e7a4afd4aedaff06e687594e089dede3c44
 f577a7903cc54959be2e34bc4f7f80b7009efcf4
 '''));
@@ -80,18 +82,21 @@
     });
 
     testUsingContext('suppresses non-Flutter lines from output', () async {
-      when(mockIMobileDevice.startLogger()).thenAnswer((_) {
+      when(mockIMobileDevice.startLogger()).thenAnswer((Invocation invocation) {
         final Process mockProcess = new MockProcess();
-        when(mockProcess.stdout).thenReturn(new Stream<List<int>>.fromIterable(<List<int>>['''
+        when(mockProcess.stdout).thenAnswer((Invocation invocation) =>
+            new Stream<List<int>>.fromIterable(<List<int>>['''
   Runner(Flutter)[297] <Notice>: A is for ari
   Runner(libsystem_asl.dylib)[297] <Notice>: libMobileGestalt MobileGestaltSupport.m:153: pid 123 (Runner) does not have sandbox access for frZQaeyWLUvLjeuEK43hmg and IS NOT appropriately entitled
   Runner(libsystem_asl.dylib)[297] <Notice>: libMobileGestalt MobileGestalt.c:550: no access to InverseDeviceID (see <rdar://problem/11744455>)
   Runner(Flutter)[297] <Notice>: I is for ichigo
   Runner(UIKit)[297] <Notice>: E is for enpitsu"
   '''.codeUnits]));
-        when(mockProcess.stderr).thenReturn(const Stream<List<int>>.empty());
+        when(mockProcess.stderr)
+            .thenAnswer((Invocation invocation) => const Stream<List<int>>.empty());
         // Delay return of exitCode until after stdout stream data, since it terminates the logger.
-        when(mockProcess.exitCode).thenReturn(new Future<int>.delayed(Duration.ZERO, () => 0));
+        when(mockProcess.exitCode)
+            .thenAnswer((Invocation invocation) => new Future<int>.delayed(Duration.ZERO, () => 0));
         return new Future<Process>.value(mockProcess);
       });
 
diff --git a/packages/flutter_tools/test/ios/mac_test.dart b/packages/flutter_tools/test/ios/mac_test.dart
index 812c4a1..60f38db 100644
--- a/packages/flutter_tools/test/ios/mac_test.dart
+++ b/packages/flutter_tools/test/ios/mac_test.dart
@@ -81,8 +81,8 @@
 
       testUsingContext('idevicescreenshot captures and returns screenshot', () async {
         when(mockOutputFile.path).thenReturn(outputPath);
-        when(mockProcessManager.run(any, environment: null, workingDirectory:  null))
-            .thenReturn(new Future<ProcessResult>.value(new ProcessResult(4, 0, '', '')));
+        when(mockProcessManager.run(any, environment: null, workingDirectory:  null)).thenAnswer(
+            (Invocation invocation) => new Future<ProcessResult>.value(new ProcessResult(4, 0, '', '')));
 
         await iMobileDevice.takeScreenshot(mockOutputFile);
         verify(mockProcessManager.run(<String>['idevicescreenshot', outputPath],
diff --git a/packages/flutter_tools/test/ios/simulators_test.dart b/packages/flutter_tools/test/ios/simulators_test.dart
index 8cca0db..abdc4e0 100644
--- a/packages/flutter_tools/test/ios/simulators_test.dart
+++ b/packages/flutter_tools/test/ios/simulators_test.dart
@@ -152,7 +152,7 @@
       // Let everything else return exit code 0 so process.dart doesn't crash.
       when(
         mockProcessManager.run(any, environment: null, workingDirectory:  null)
-      ).thenReturn(
+      ).thenAnswer((Invocation invocation) =>
         new Future<ProcessResult>.value(new ProcessResult(2, 0, '', ''))
       );
       // Doesn't matter what the device is.
@@ -206,7 +206,7 @@
     setUp(() {
       mockProcessManager = new MockProcessManager();
       when(mockProcessManager.start(any, environment: null, workingDirectory: null))
-        .thenReturn(new Future<Process>.value(new MockProcess()));
+        .thenAnswer((Invocation invocation) => new Future<Process>.value(new MockProcess()));
     });
 
     testUsingContext('uses tail on iOS versions prior to iOS 11', () async {
@@ -240,7 +240,7 @@
     setUp(() {
       mockProcessManager = new MockProcessManager();
       when(mockProcessManager.start(any, environment: null, workingDirectory: null))
-        .thenReturn(new Future<Process>.value(new MockProcess()));
+        .thenAnswer((Invocation invocation) => new Future<Process>.value(new MockProcess()));
     });
 
     testUsingContext('uses tail on iOS versions prior to iOS 11', () async {
diff --git a/packages/flutter_tools/test/stop_test.dart b/packages/flutter_tools/test/stop_test.dart
index 8109418..fab854e 100644
--- a/packages/flutter_tools/test/stop_test.dart
+++ b/packages/flutter_tools/test/stop_test.dart
@@ -23,7 +23,7 @@
       final StopCommand command = new StopCommand();
       applyMocksToCommand(command);
       final MockAndroidDevice device = new MockAndroidDevice();
-      when(device.stopApp(any)).thenReturn(new Future<bool>.value(true));
+      when(device.stopApp(any)).thenAnswer((Invocation invocation) => new Future<bool>.value(true));
       testDeviceManager.addDevice(device);
       await createTestCommandRunner(command).run(<String>['stop']);
     });
@@ -32,7 +32,7 @@
       final StopCommand command = new StopCommand();
       applyMocksToCommand(command);
       final MockIOSDevice device = new MockIOSDevice();
-      when(device.stopApp(any)).thenReturn(new Future<bool>.value(true));
+      when(device.stopApp(any)).thenAnswer((Invocation invocation) => new Future<bool>.value(true));
       testDeviceManager.addDevice(device);
 
       await createTestCommandRunner(command).run(<String>['stop']);