diff --git a/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart
index acfe4a8..4d1c029 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart
@@ -827,8 +827,6 @@
 }
 
 class MockDartDevelopmentService extends Mock implements DartDevelopmentService {}
-class MockProcessManager extends Mock implements ProcessManager {}
-class MockProcess extends Mock implements Process {}
 class MockHttpClientRequest extends Mock implements HttpClientRequest {}
 class MockHttpClientResponse extends Mock implements HttpClientResponse {}
 class MockHttpHeaders extends Mock implements HttpHeaders {}
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart
index 1b3e276..4688017 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart
@@ -5,7 +5,6 @@
 import 'package:file/memory.dart';
 import 'package:file_testing/file_testing.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/io.dart';
 import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/commands/build_windows.dart';
@@ -420,7 +419,5 @@
   });
 }
 
-class MockProcessManager extends Mock implements ProcessManager {}
-class MockProcess extends Mock implements Process {}
 class MockVisualStudio extends Mock implements VisualStudio {}
 class MockUsage extends Mock implements Usage {}
diff --git a/packages/flutter_tools/test/commands.shard/permeable/upgrade_test.dart b/packages/flutter_tools/test/commands.shard/permeable/upgrade_test.dart
index d7186b5..fb8ffda 100644
--- a/packages/flutter_tools/test/commands.shard/permeable/upgrade_test.dart
+++ b/packages/flutter_tools/test/commands.shard/permeable/upgrade_test.dart
@@ -24,7 +24,7 @@
   group('UpgradeCommandRunner', () {
     FakeUpgradeCommandRunner fakeCommandRunner;
     UpgradeCommandRunner realCommandRunner;
-    MockProcessManager processManager;
+    FakeProcessManager processManager;
     FakePlatform fakePlatform;
     final MockFlutterVersion flutterVersion = MockFlutterVersion();
     const GitTagVersion gitTagVersion = GitTagVersion(
@@ -40,19 +40,7 @@
     setUp(() {
       fakeCommandRunner = FakeUpgradeCommandRunner();
       realCommandRunner = UpgradeCommandRunner();
-      processManager = MockProcessManager();
-      when(processManager.start(
-        <String>[
-          globals.fs.path.join('bin', 'flutter'),
-          'upgrade',
-          '--continue',
-          '--no-version-check',
-        ],
-        environment: anyNamed('environment'),
-        workingDirectory: anyNamed('workingDirectory'),
-      )).thenAnswer((Invocation invocation) async {
-        return Future<Process>.value(createMockProcess());
-      });
+      processManager = FakeProcessManager.list(<FakeCommand>[]);
       fakeCommandRunner.willHaveUncomittedChanges = false;
       fakePlatform = FakePlatform()..environment = Map<String, String>.unmodifiable(<String, String>{
         'ENV1': 'irrelevant',
@@ -69,24 +57,11 @@
         flutterVersion: flutterVersion,
       );
       expect(result, throwsToolExit());
+      expect(processManager.hasRemainingExpectations, isFalse);
     }, overrides: <Type, Generator>{
       Platform: () => fakePlatform,
     });
 
-    testUsingContext('does not throw on unknown tag, official branch, force', () async {
-      final Future<FlutterCommandResult> result = fakeCommandRunner.runCommand(
-        force: true,
-        continueFlow: false,
-        testFlow: false,
-        gitTagVersion: const GitTagVersion.unknown(),
-        flutterVersion: flutterVersion,
-      );
-      expect(await result, FlutterCommandResult.success());
-    }, overrides: <Type, Generator>{
-      ProcessManager: () => processManager,
-      Platform: () => fakePlatform,
-    });
-
     testUsingContext('throws tool exit with uncommitted changes', () async {
       fakeCommandRunner.willHaveUncomittedChanges = true;
       final Future<FlutterCommandResult> result = fakeCommandRunner.runCommand(
@@ -97,40 +72,11 @@
         flutterVersion: flutterVersion,
       );
       expect(result, throwsToolExit());
+      expect(processManager.hasRemainingExpectations, isFalse);
     }, overrides: <Type, Generator>{
       Platform: () => fakePlatform,
     });
 
-    testUsingContext('does not throw tool exit with uncommitted changes and force', () async {
-      fakeCommandRunner.willHaveUncomittedChanges = true;
-
-      final Future<FlutterCommandResult> result = fakeCommandRunner.runCommand(
-        force: true,
-        continueFlow: false,
-        testFlow: false,
-        gitTagVersion: gitTagVersion,
-        flutterVersion: flutterVersion,
-      );
-      expect(await result, FlutterCommandResult.success());
-    }, overrides: <Type, Generator>{
-      ProcessManager: () => processManager,
-      Platform: () => fakePlatform,
-    });
-
-    testUsingContext("Doesn't throw on known tag, dev branch, no force", () async {
-      final Future<FlutterCommandResult> result = fakeCommandRunner.runCommand(
-        force: false,
-        continueFlow: false,
-        testFlow: false,
-        gitTagVersion: gitTagVersion,
-        flutterVersion: flutterVersion,
-      );
-      expect(await result, FlutterCommandResult.success());
-    }, overrides: <Type, Generator>{
-      ProcessManager: () => processManager,
-      Platform: () => fakePlatform,
-    });
-
     testUsingContext("Doesn't continue on known tag, dev branch, no force, already up-to-date", () async {
       const String revision = 'abc123';
       when(flutterVersion.frameworkRevision).thenReturn(revision);
@@ -144,17 +90,8 @@
         flutterVersion: flutterVersion,
       );
       expect(await result, FlutterCommandResult.success());
-      verifyNever(globals.processManager.start(
-        <String>[
-          globals.fs.path.join('bin', 'flutter'),
-          'upgrade',
-          '--continue',
-          '--no-version-check',
-        ],
-        environment: anyNamed('environment'),
-        workingDirectory: anyNamed('workingDirectory'),
-      ));
       expect(testLogger.statusText, contains('Flutter is already up to date'));
+      expect(processManager.hasRemainingExpectations, isFalse);
     }, overrides: <Type, Generator>{
       ProcessManager: () => processManager,
       Platform: () => fakePlatform,
@@ -162,78 +99,75 @@
 
     testUsingContext('fetchRemoteRevision returns revision if git succeeds', () async {
       const String revision = 'abc123';
-      when(processManager.run(
-        <String>['git', 'fetch', '--tags'],
-        environment:anyNamed('environment'),
-        workingDirectory: anyNamed('workingDirectory')),
-      ).thenAnswer((Invocation invocation) async {
-        return FakeProcessResult()
-          ..exitCode = 0;
-      });
-      when(processManager.run(
-        <String>['git', 'rev-parse', '--verify', '@{u}'],
-        environment:anyNamed('environment'),
-        workingDirectory: anyNamed('workingDirectory')),
-      ).thenAnswer((Invocation invocation) async {
-        return FakeProcessResult()
-          ..exitCode = 0
-          ..stdout = revision;
-      });
+
+      processManager.addCommands(<FakeCommand>[
+        const FakeCommand(command: <String>[
+          'git', 'fetch', '--tags'
+        ]),
+        const FakeCommand(command: <String>[
+          'git', 'rev-parse', '--verify', '@{u}',
+        ],
+        stdout: revision),
+      ]);
+
       expect(await realCommandRunner.fetchRemoteRevision(), revision);
+      expect(processManager.hasRemainingExpectations, isFalse);
     }, overrides: <Type, Generator>{
       ProcessManager: () => processManager,
       Platform: () => fakePlatform,
     });
 
     testUsingContext('fetchRemoteRevision throws toolExit if HEAD is detached', () async {
-      when(processManager.run(
-        <String>['git', 'fetch', '--tags'],
-        environment:anyNamed('environment'),
-        workingDirectory: anyNamed('workingDirectory')),
-      ).thenAnswer((Invocation invocation) async {
-        return FakeProcessResult()..exitCode = 0;
-      });
-      when(processManager.run(
-        <String>['git', 'rev-parse', '--verify', '@{u}'],
-        environment:anyNamed('environment'),
-        workingDirectory: anyNamed('workingDirectory')),
-      ).thenThrow(const ProcessException(
-        'git',
-        <String>['rev-parse', '--verify', '@{u}'],
-        'fatal: HEAD does not point to a branch',
-      ));
-      expect(
-        () async => await realCommandRunner.fetchRemoteRevision(),
+      processManager.addCommands(<FakeCommand>[
+        const FakeCommand(command: <String>[
+          'git', 'fetch', '--tags'
+        ]),
+        FakeCommand(
+          command: const <String>['git', 'rev-parse', '--verify', '@{u}'],
+          onRun: () {
+            throw const ProcessException(
+              'git',
+              <String>['rev-parse', '--verify', '@{u}'],
+              'fatal: HEAD does not point to a branch',
+            );
+          }
+        ),
+      ]);
+
+      await expectLater(
+            () async => await realCommandRunner.fetchRemoteRevision(),
         throwsToolExit(message: 'You are not currently on a release branch.'),
       );
+      expect(processManager.hasRemainingExpectations, isFalse);
     }, overrides: <Type, Generator>{
       ProcessManager: () => processManager,
       Platform: () => fakePlatform,
     });
 
     testUsingContext('fetchRemoteRevision throws toolExit if no upstream configured', () async {
-      when(processManager.run(
-        <String>['git', 'fetch', '--tags'],
-        environment:anyNamed('environment'),
-        workingDirectory: anyNamed('workingDirectory')),
-      ).thenAnswer((Invocation invocation) async {
-        return FakeProcessResult()..exitCode = 0;
-      });
-      when(processManager.run(
-        <String>['git', 'rev-parse', '--verify', '@{u}'],
-        environment:anyNamed('environment'),
-        workingDirectory: anyNamed('workingDirectory')),
-      ).thenThrow(const ProcessException(
-        'git',
-        <String>['rev-parse', '--verify', '@{u}'],
-        'fatal: no upstream configured for branch',
-      ));
-      expect(
-        () async => await realCommandRunner.fetchRemoteRevision(),
+      processManager.addCommands(<FakeCommand>[
+        const FakeCommand(command: <String>[
+          'git', 'fetch', '--tags'
+        ]),
+        FakeCommand(
+          command: const <String>['git', 'rev-parse', '--verify', '@{u}'],
+          onRun: () {
+            throw const ProcessException(
+              'git',
+              <String>['rev-parse', '--verify', '@{u}'],
+              'fatal: no upstream configured for branch',
+            );
+          },
+        ),
+      ]);
+
+      await expectLater(
+            () async => await realCommandRunner.fetchRemoteRevision(),
         throwsToolExit(
           message: 'Unable to upgrade Flutter: no origin repository configured\.',
         ),
       );
+      expect(processManager.hasRemainingExpectations, isFalse);
     }, overrides: <Type, Generator>{
       ProcessManager: () => processManager,
       Platform: () => fakePlatform,
@@ -242,132 +176,185 @@
     testUsingContext('git exception during attemptReset throwsToolExit', () async {
       const String revision = 'abc123';
       const String errorMessage = 'fatal: Could not parse object ´$revision´';
-      when(processManager.run(
-        <String>['git', 'reset', '--hard', revision]
-      )).thenThrow(const ProcessException(
-        'git',
-        <String>['reset', '--hard', revision],
-        errorMessage,
-      ));
+      processManager.addCommands(<FakeCommand>[
+        FakeCommand(
+          command: const <String>['git', 'reset', '--hard', revision],
+          onRun: () {
+            throw const ProcessException(
+              'git',
+              <String>['reset', '--hard', revision],
+              errorMessage,
+            );
+          },
+        ),
+      ]);
 
-      expect(
-        () async => await realCommandRunner.attemptReset(revision),
+      await expectLater(
+            () async => await realCommandRunner.attemptReset(revision),
         throwsToolExit(message: errorMessage),
       );
+      expect(processManager.hasRemainingExpectations, isFalse);
     }, overrides: <Type, Generator>{
       ProcessManager: () => processManager,
       Platform: () => fakePlatform,
     });
 
     testUsingContext('flutterUpgradeContinue passes env variables to child process', () async {
+      processManager.addCommand(
+        FakeCommand(
+          command: <String>[
+            globals.fs.path.join('bin', 'flutter'),
+            'upgrade',
+            '--continue',
+            '--no-version-check',
+          ],
+          environment: <String, String>{'FLUTTER_ALREADY_LOCKED': 'true', ...fakePlatform.environment}
+        ),
+      );
       await realCommandRunner.flutterUpgradeContinue();
-
-      final VerificationResult result = verify(globals.processManager.start(
-        <String>[
-          globals.fs.path.join('bin', 'flutter'),
-          'upgrade',
-          '--continue',
-          '--no-version-check',
-        ],
-        environment: captureAnyNamed('environment'),
-        workingDirectory: anyNamed('workingDirectory'),
-      ));
-
-      expect(result.captured.first,
-          <String, String>{ 'FLUTTER_ALREADY_LOCKED': 'true', ...fakePlatform.environment });
+      expect(processManager.hasRemainingExpectations, isFalse);
     }, overrides: <Type, Generator>{
       ProcessManager: () => processManager,
       Platform: () => fakePlatform,
     });
 
     testUsingContext('precacheArtifacts passes env variables to child process', () async {
-      final List<String> precacheCommand = <String>[
-        globals.fs.path.join('bin', 'flutter'),
-        '--no-color',
-        '--no-version-check',
-        'precache',
-      ];
-
-      when(globals.processManager.start(
-        precacheCommand,
-        environment: anyNamed('environment'),
-        workingDirectory: anyNamed('workingDirectory'),
-      )).thenAnswer((Invocation invocation) async {
-        return Future<Process>.value(createMockProcess());
-      });
-
+      processManager.addCommand(
+        FakeCommand(
+          command: <String>[
+            globals.fs.path.join('bin', 'flutter'),
+            '--no-color',
+            '--no-version-check',
+            'precache',
+          ],
+          environment: <String, String>{'FLUTTER_ALREADY_LOCKED': 'true', ...fakePlatform.environment}
+        ),
+      );
       await realCommandRunner.precacheArtifacts();
-
-      final VerificationResult result = verify(globals.processManager.start(
-        precacheCommand,
-        environment: captureAnyNamed('environment'),
-        workingDirectory: anyNamed('workingDirectory'),
-      ));
-
-      expect(result.captured.first,
-          <String, String>{ 'FLUTTER_ALREADY_LOCKED': 'true', ...fakePlatform.environment });
+      expect(processManager.hasRemainingExpectations, isFalse);
     }, overrides: <Type, Generator>{
       ProcessManager: () => processManager,
       Platform: () => fakePlatform,
     });
 
-    group('full command', () {
-      FakeProcessManager fakeProcessManager;
-      Directory tempDir;
-      File flutterToolState;
-
-      FlutterVersion mockFlutterVersion;
-
+    group('runs upgrade', () {
       setUp(() {
-        Cache.disableLocking();
-        fakeProcessManager = FakeProcessManager.list(<FakeCommand>[
-          const FakeCommand(
-            command: <String>[
-              'git', 'tag', '--points-at', 'HEAD',
-            ],
-            stdout: '',
-          ),
-          const FakeCommand(
-            command: <String>[
-              'git', 'describe', '--match', '*.*.*', '--first-parent', '--long', '--tags',
-            ],
-            stdout: 'v1.12.16-19-gb45b676af',
-          ),
-        ]);
-        tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_upgrade_test.');
-        flutterToolState = tempDir.childFile('.flutter_tool_state');
-        mockFlutterVersion = MockFlutterVersion(isStable: true);
-      });
-
-      tearDown(() {
-        Cache.enableLocking();
-        tryToDelete(tempDir);
-      });
-
-      testUsingContext('upgrade continue prints welcome message', () async {
-        final UpgradeCommand upgradeCommand = UpgradeCommand(fakeCommandRunner);
-        applyMocksToCommand(upgradeCommand);
-
-        await createTestCommandRunner(upgradeCommand).run(
-          <String>[
+        processManager.addCommand(
+          FakeCommand(command: <String>[
+            globals.fs.path.join('bin', 'flutter'),
             'upgrade',
             '--continue',
-          ],
+            '--no-version-check',
+          ]),
         );
+      });
 
-        expect(
-          json.decode(flutterToolState.readAsStringSync()),
-          containsPair('redisplay-welcome-message', true),
+      testUsingContext('does not throw on unknown tag, official branch, force', () async {
+        final Future<FlutterCommandResult> result = fakeCommandRunner.runCommand(
+          force: true,
+          continueFlow: false,
+          testFlow: false,
+          gitTagVersion: const GitTagVersion.unknown(),
+          flutterVersion: flutterVersion,
         );
+        expect(await result, FlutterCommandResult.success());
+        expect(processManager.hasRemainingExpectations, isFalse);
       }, overrides: <Type, Generator>{
-        FlutterVersion: () => mockFlutterVersion,
-        ProcessManager: () => fakeProcessManager,
-        PersistentToolState: () => PersistentToolState.test(
-          directory: tempDir,
-          logger: testLogger,
-        ),
+        ProcessManager: () => processManager,
+        Platform: () => fakePlatform,
+      });
+
+      testUsingContext('does not throw tool exit with uncommitted changes and force', () async {
+        fakeCommandRunner.willHaveUncomittedChanges = true;
+
+        final Future<FlutterCommandResult> result = fakeCommandRunner.runCommand(
+          force: true,
+          continueFlow: false,
+          testFlow: false,
+          gitTagVersion: gitTagVersion,
+          flutterVersion: flutterVersion,
+        );
+        expect(await result, FlutterCommandResult.success());
+        expect(processManager.hasRemainingExpectations, isFalse);
+      }, overrides: <Type, Generator>{
+        ProcessManager: () => processManager,
+        Platform: () => fakePlatform,
+      });
+
+      testUsingContext("Doesn't throw on known tag, dev branch, no force", () async {
+        final Future<FlutterCommandResult> result = fakeCommandRunner.runCommand(
+          force: false,
+          continueFlow: false,
+          testFlow: false,
+          gitTagVersion: gitTagVersion,
+          flutterVersion: flutterVersion,
+        );
+        expect(await result, FlutterCommandResult.success());
+        expect(processManager.hasRemainingExpectations, isFalse);
+      }, overrides: <Type, Generator>{
+        ProcessManager: () => processManager,
+        Platform: () => fakePlatform,
+      });
+
+      group('full command', () {
+        FakeProcessManager fakeProcessManager;
+        Directory tempDir;
+        File flutterToolState;
+
+        FlutterVersion mockFlutterVersion;
+
+        setUp(() {
+          Cache.disableLocking();
+          fakeProcessManager = FakeProcessManager.list(<FakeCommand>[
+            const FakeCommand(
+              command: <String>[
+                'git', 'tag', '--points-at', 'HEAD',
+              ],
+              stdout: '',
+            ),
+            const FakeCommand(
+              command: <String>[
+                'git', 'describe', '--match', '*.*.*', '--first-parent', '--long', '--tags',
+              ],
+              stdout: 'v1.12.16-19-gb45b676af',
+            ),
+          ]);
+          tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_upgrade_test.');
+          flutterToolState = tempDir.childFile('.flutter_tool_state');
+          mockFlutterVersion = MockFlutterVersion(isStable: true);
+        });
+
+        tearDown(() {
+          Cache.enableLocking();
+          tryToDelete(tempDir);
+        });
+
+        testUsingContext('upgrade continue prints welcome message', () async {
+          final UpgradeCommand upgradeCommand = UpgradeCommand(fakeCommandRunner);
+          applyMocksToCommand(upgradeCommand);
+
+          await createTestCommandRunner(upgradeCommand).run(
+            <String>[
+              'upgrade',
+              '--continue',
+            ],
+          );
+
+          expect(
+            json.decode(flutterToolState.readAsStringSync()),
+            containsPair('redisplay-welcome-message', true),
+          );
+        }, overrides: <Type, Generator>{
+          FlutterVersion: () => mockFlutterVersion,
+          ProcessManager: () => fakeProcessManager,
+          PersistentToolState: () => PersistentToolState.test(
+            directory: tempDir,
+            logger: testLogger,
+          ),
+        });
       });
     });
+
   });
 }
 
@@ -399,19 +386,3 @@
   @override
   Future<void> runDoctor() async {}
 }
-
-class MockProcess extends Mock implements Process {}
-class MockProcessManager extends Mock implements ProcessManager {}
-class FakeProcessResult implements ProcessResult {
-  @override
-  int exitCode;
-
-  @override
-  int pid = 0;
-
-  @override
-  String stderr = '';
-
-  @override
-  String stdout = '';
-}
diff --git a/packages/flutter_tools/test/general.shard/application_package_test.dart b/packages/flutter_tools/test/general.shard/application_package_test.dart
index 1398ed6..ae1d924 100644
--- a/packages/flutter_tools/test/general.shard/application_package_test.dart
+++ b/packages/flutter_tools/test/general.shard/application_package_test.dart
@@ -3,7 +3,6 @@
 // found in the LICENSE file.
 
 import 'dart:convert';
-import 'dart:io' show ProcessResult;
 
 import 'package:file/file.dart';
 import 'package:file/memory.dart';
@@ -30,44 +29,35 @@
   Platform: _kNoColorTerminalPlatform,
 };
 
-class MockitoProcessManager extends Mock implements ProcessManager {}
 class MockitoAndroidSdk extends Mock implements AndroidSdk {}
 class MockitoAndroidSdkVersion extends Mock implements AndroidSdkVersion {}
 
 void main() {
   group('Apk with partial Android SDK works', () {
     AndroidSdk sdk;
-    ProcessManager mockProcessManager;
+    FakeProcessManager fakeProcessManager;
     MemoryFileSystem fs;
     Cache cache;
-    File gradle;
     final Map<Type, Generator> overrides = <Type, Generator>{
       AndroidSdk: () => sdk,
-      ProcessManager: () => mockProcessManager,
+      ProcessManager: () => fakeProcessManager,
       FileSystem: () => fs,
       Cache: () => cache,
     };
 
     setUp(() async {
       sdk = MockitoAndroidSdk();
-      mockProcessManager = MockitoProcessManager();
+      fakeProcessManager = FakeProcessManager.list(<FakeCommand>[]);
       fs = MemoryFileSystem.test();
       cache = Cache.test(
-        processManager: FakeProcessManager.any()
+        processManager: FakeProcessManager.any(),
       );
       Cache.flutterRoot = '../..';
       when(sdk.licensesAvailable).thenReturn(true);
-      when(mockProcessManager.canRun(any)).thenReturn(true);
-      when(mockProcessManager.run(
-        any,
-        workingDirectory: anyNamed('workingDirectory'),
-        environment: anyNamed('environment'),
-      )).thenAnswer((_) async => ProcessResult(1, 0, 'stdout', 'stderr'));
-      when(mockProcessManager.runSync(any)).thenReturn(ProcessResult(1, 0, 'stdout', 'stderr'));
       final FlutterProject project = FlutterProject.current();
-      gradle = globals.fs.file(project.android.hostAppGradleRoot.childFile(
+      globals.fs.file(project.android.hostAppGradleRoot.childFile(
         globals.platform.isWindows ? 'gradlew.bat' : 'gradlew',
-      ).path)..createSync(recursive: true);
+      ).path).createSync(recursive: true);
     });
 
     testUsingContext('Licenses not available, platform and buildtools available, apk exists', () async {
@@ -78,18 +68,19 @@
       when(sdk.latestVersion).thenReturn(sdkVersion);
       when(sdk.platformToolsAvailable).thenReturn(true);
       when(sdk.licensesAvailable).thenReturn(false);
-      when(mockProcessManager.runSync(
-          argThat(equals(<String>[
+
+      fakeProcessManager.addCommand(
+        FakeCommand(
+          command: <String>[
             aaptPath,
             'dump',
             'xmltree',
-            apkFile.path,
+             apkFile.path,
             'AndroidManifest.xml',
-          ])),
-          workingDirectory: anyNamed('workingDirectory'),
-          environment: anyNamed('environment'),
-        ),
-      ).thenReturn(ProcessResult(0, 0, _aaptDataWithDefaultEnabledAndMainLauncherActivity, ''));
+          ],
+          stdout: _aaptDataWithDefaultEnabledAndMainLauncherActivity
+        )
+      );
 
       final ApplicationPackage applicationPackage = await ApplicationPackageFactory.instance.getPackageForPlatform(
         TargetPlatform.android_arm,
@@ -97,6 +88,7 @@
         applicationBinary: apkFile,
       );
       expect(applicationPackage.name, 'app.apk');
+      expect(fakeProcessManager.hasRemainingExpectations, isFalse);
     }, overrides: overrides);
 
     testUsingContext('Licenses available, build tools not, apk exists', () async {
@@ -117,18 +109,14 @@
       gradleWrapperDir.childFile('gradlew').writeAsStringSync('irrelevant');
       gradleWrapperDir.childFile('gradlew.bat').writeAsStringSync('irrelevant');
 
+      fakeProcessManager.addCommand(FakeCommand(command: <String>[gradle.path, 'dependencies']));
+
       await ApplicationPackageFactory.instance.getPackageForPlatform(
         TargetPlatform.android_arm,
         buildInfo: null,
         applicationBinary: globals.fs.file('app.apk'),
       );
-      verify(
-        mockProcessManager.run(
-          argThat(equals(<String>[gradle.path, 'dependencies'])),
-          workingDirectory: anyNamed('workingDirectory'),
-          environment: anyNamed('environment'),
-        ),
-      ).called(1);
+      expect(fakeProcessManager.hasRemainingExpectations, isFalse);
     }, overrides: overrides);
 
     testUsingContext('Licenses available, build tools available, does not call gradle dependencies', () async {
@@ -139,22 +127,15 @@
         TargetPlatform.android_arm,
         buildInfo: null,
       );
-      verifyNever(
-        mockProcessManager.run(
-          argThat(equals(<String>[gradle.path, 'dependencies'])),
-          workingDirectory: anyNamed('workingDirectory'),
-          environment: anyNamed('environment'),
-        ),
-      );
+      expect(fakeProcessManager.hasRemainingExpectations, isFalse);
     }, overrides: overrides);
 
     testUsingContext('returns null when failed to extract manifest', () async {
       final AndroidSdkVersion sdkVersion = MockitoAndroidSdkVersion();
       when(sdk.latestVersion).thenReturn(sdkVersion);
-      when(mockProcessManager.runSync(argThat(contains('logcat'))))
-          .thenReturn(ProcessResult(0, 1, '', ''));
 
       expect(AndroidApk.fromApk(null), isNull);
+      expect(fakeProcessManager.hasRemainingExpectations, isFalse);
     }, overrides: overrides);
   });
 
