diff --git a/src/test/java/com/google/devtools/build/lib/remote/RemoteSpawnRunnerTest.java b/src/test/java/com/google/devtools/build/lib/remote/RemoteSpawnRunnerTest.java
index 18bd23f..7870c86 100644
--- a/src/test/java/com/google/devtools/build/lib/remote/RemoteSpawnRunnerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/remote/RemoteSpawnRunnerTest.java
@@ -29,9 +29,7 @@
 import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.Mockito.when;
 
-import build.bazel.remote.execution.v2.Action;
 import build.bazel.remote.execution.v2.ActionResult;
-import build.bazel.remote.execution.v2.Command;
 import build.bazel.remote.execution.v2.Digest;
 import build.bazel.remote.execution.v2.ExecuteRequest;
 import build.bazel.remote.execution.v2.ExecuteResponse;
@@ -91,12 +89,12 @@
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.time.Duration;
-import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.SortedMap;
 import java.util.concurrent.Executors;
 import java.util.concurrent.atomic.AtomicReference;
+import javax.annotation.Nullable;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -122,16 +120,14 @@
   private FakeActionInputFileCache fakeFileCache;
   private FileOutErr outErr;
 
-  private RemoteOptions options;
+  private RemoteOptions remoteOptions;
   private RemoteRetrier retrier;
 
   @Mock private GrpcRemoteCache cache;
 
-  @Mock
-  private GrpcRemoteExecutor executor;
+  @Mock private GrpcRemoteExecutor executor;
 
-  @Mock
-  private SpawnRunner localRunner;
+  @Mock private SpawnRunner localRunner;
 
   // The action key of the Spawn returned by newSimpleSpawn().
   private final String simpleActionId =
@@ -158,8 +154,8 @@
     FileSystemUtils.createDirectoryAndParents(stderr.getParentDirectory());
     outErr = new FileOutErr(stdout, stderr);
 
-    options = Options.getDefaults(RemoteOptions.class);
-    retrier = RemoteModule.createExecuteRetrier(options, retryService);
+    remoteOptions = Options.getDefaults(RemoteOptions.class);
+    retrier = RemoteModule.createExecuteRetrier(remoteOptions, retryService);
   }
 
   @AfterClass
@@ -168,46 +164,34 @@
   }
 
   @Test
-  @SuppressWarnings("unchecked")
   public void nonCachableSpawnsShouldNotBeCached_remote() throws Exception {
     // Test that if a spawn is marked "NO_CACHE" then it's not fetched from a remote cache.
     // It should be executed remotely, but marked non-cacheable to remote execution, so that
     // the action result is not saved in the remote cache.
 
-    options.remoteAcceptCached = true;
-    options.remoteLocalFallback = false;
-    options.remoteUploadLocalResults = true;
-    options.remoteResultCachePriority = 1;
-    options.remoteExecutionPriority = 2;
+    remoteOptions.remoteAcceptCached = true;
+    remoteOptions.remoteLocalFallback = false;
+    remoteOptions.remoteUploadLocalResults = true;
+    remoteOptions.remoteResultCachePriority = 1;
+    remoteOptions.remoteExecutionPriority = 2;
 
-    RemoteSpawnRunner runner =
-        new RemoteSpawnRunner(
-            execRoot,
-            options,
-            Options.getDefaults(ExecutionOptions.class),
-            new AtomicReference<>(localRunner),
-            true,
-            /*cmdlineReporter=*/ null,
-            "build-req-id",
-            "command-id",
-            cache,
-            executor,
-            retrier,
-            digestUtil,
-            logDir);
+    RemoteSpawnRunner runner = newSpawnRunner();
 
-    ExecuteResponse succeeded = ExecuteResponse.newBuilder().setResult(
-        ActionResult.newBuilder().setExitCode(0).build()).build();
+    ExecuteResponse succeeded =
+        ExecuteResponse.newBuilder()
+            .setResult(ActionResult.newBuilder().setExitCode(0).build())
+            .build();
     when(executor.executeRemotely(any(ExecuteRequest.class))).thenReturn(succeeded);
 
-    Spawn spawn = new SimpleSpawn(
-        new FakeOwner("foo", "bar"),
-        /*arguments=*/ ImmutableList.of(),
-        /*environment=*/ ImmutableMap.of(),
-        NO_CACHE,
-        /*inputs=*/ ImmutableList.of(),
-        /*outputs=*/ ImmutableList.<ActionInput>of(),
-        ResourceSet.ZERO);
+    Spawn spawn =
+        new SimpleSpawn(
+            new FakeOwner("foo", "bar"),
+            /*arguments=*/ ImmutableList.of(),
+            /*environment=*/ ImmutableMap.of(),
+            NO_CACHE,
+            /*inputs=*/ ImmutableList.of(),
+            /*outputs=*/ ImmutableList.<ActionInput>of(),
+            ResourceSet.ZERO);
 
     SpawnExecutionContext policy = new FakeSpawnExecutionContext(spawn);
 
@@ -220,56 +204,34 @@
     assertThat(requestCaptor.getValue().getExecutionPolicy().getPriority()).isEqualTo(2);
     // TODO(olaola): verify that the uploaded action has the doNotCache set.
 
-    verify(cache, never())
-        .getCachedActionResult(any(ActionKey.class));
-    verify(cache, never())
-        .upload(
-            any(ActionKey.class),
-            any(Action.class),
-            any(Command.class),
-            any(Path.class),
-            any(Collection.class),
-            any(FileOutErr.class));
+    verify(cache, never()).getCachedActionResult(any(ActionKey.class));
+    verify(cache, never()).upload(any(), any(), any(), any(), any(), any());
     verifyZeroInteractions(localRunner);
   }
 
   @Test
-  @SuppressWarnings("unchecked")
   public void nonCachableSpawnsShouldNotBeCached_local() throws Exception {
     // Test that if a spawn is executed locally, due to the local fallback, that its result is not
     // uploaded to the remote cache.
 
-    options.remoteAcceptCached = true;
-    options.remoteLocalFallback = true;
-    options.remoteUploadLocalResults = true;
+    remoteOptions.remoteAcceptCached = true;
+    remoteOptions.remoteLocalFallback = true;
+    remoteOptions.remoteUploadLocalResults = true;
 
-    RemoteSpawnRunner runner =
-        new RemoteSpawnRunner(
-            execRoot,
-            options,
-            Options.getDefaults(ExecutionOptions.class),
-            new AtomicReference<>(localRunner),
-            true,
-            /*cmdlineReporter=*/ null,
-            "build-req-id",
-            "command-id",
-            cache,
-            null,
-            retrier,
-            digestUtil,
-            logDir);
+    RemoteSpawnRunner runner = newSpawnRunnerWithoutExecutor();
 
     // Throw an IOException to trigger the local fallback.
     when(executor.executeRemotely(any(ExecuteRequest.class))).thenThrow(IOException.class);
 
-    Spawn spawn = new SimpleSpawn(
-        new FakeOwner("foo", "bar"),
-        /*arguments=*/ ImmutableList.of(),
-        /*environment=*/ ImmutableMap.of(),
-        NO_CACHE,
-        /*inputs=*/ ImmutableList.of(),
-        /*outputs=*/ ImmutableList.<ActionInput>of(),
-        ResourceSet.ZERO);
+    Spawn spawn =
+        new SimpleSpawn(
+            new FakeOwner("foo", "bar"),
+            /*arguments=*/ ImmutableList.of(),
+            /*environment=*/ ImmutableMap.of(),
+            NO_CACHE,
+            /*inputs=*/ ImmutableList.of(),
+            /*outputs=*/ ImmutableList.<ActionInput>of(),
+            ResourceSet.ZERO);
 
     SpawnExecutionContext policy = new FakeSpawnExecutionContext(spawn);
 
@@ -277,34 +239,17 @@
 
     verify(localRunner).exec(spawn, policy);
 
-    verify(cache, never())
-        .getCachedActionResult(any(ActionKey.class));
+    verify(cache, never()).getCachedActionResult(any(ActionKey.class));
     verifyNoMoreInteractions(cache);
   }
 
   @Test
-  @SuppressWarnings("unchecked")
   public void failedLocalActionShouldNotBeUploaded() throws Exception {
     // Test that the outputs of a locally executed action that failed are not uploaded.
 
-    options.remoteUploadLocalResults = true;
+    remoteOptions.remoteUploadLocalResults = true;
 
-    RemoteSpawnRunner runner =
-        spy(
-            new RemoteSpawnRunner(
-                execRoot,
-                options,
-                Options.getDefaults(ExecutionOptions.class),
-                new AtomicReference<>(localRunner),
-                true,
-                /*cmdlineReporter=*/ null,
-                "build-req-id",
-                "command-id",
-                cache,
-                null,
-                retrier,
-                digestUtil,
-                logDir));
+    RemoteSpawnRunner runner = spy(newSpawnRunnerWithoutExecutor());
 
     Spawn spawn = newSimpleSpawn();
     SpawnExecutionContext policy = new FakeSpawnExecutionContext(spawn);
@@ -321,48 +266,25 @@
         .execLocallyAndUpload(
             eq(spawn),
             eq(policy),
-            any(SortedMap.class),
+            any(),
             eq(cache),
-            any(ActionKey.class),
-            any(Action.class),
-            any(Command.class),
+            any(),
+            any(),
+            any(),
             /* uploadLocalResults= */ eq(true));
-    verify(cache, never())
-        .upload(
-            any(ActionKey.class),
-            any(Action.class),
-            any(Command.class),
-            any(Path.class),
-            any(Collection.class),
-            any(FileOutErr.class));
+    verify(cache, never()).upload(any(), any(), any(), any(), any(), any());
   }
 
   @Test
-  @SuppressWarnings("unchecked")
   public void treatFailedCachedActionAsCacheMiss_local() throws Exception {
     // Test that bazel treats failed cache action as a cache miss and attempts to execute action
     // locally
 
-    RemoteOptions options = Options.getDefaults(RemoteOptions.class);
     ActionResult failedAction = ActionResult.newBuilder().setExitCode(1).build();
     when(cache.getCachedActionResult(any(ActionKey.class))).thenReturn(failedAction);
 
-    RemoteSpawnRunner runner =
-        spy(
-            new RemoteSpawnRunner(
-                execRoot,
-                options,
-                Options.getDefaults(ExecutionOptions.class),
-                new AtomicReference<>(localRunner),
-                true,
-                /* cmdlineReporter= */ null,
-                "build-req-id",
-                "command-id",
-                cache,
-                null,
-                retrier,
-                digestUtil,
-                logDir));
+    RemoteSpawnRunner runner = spy(newSpawnRunnerWithoutExecutor());
+
     Spawn spawn = newSimpleSpawn();
     SpawnExecutionContext policy = new FakeSpawnExecutionContext(spawn);
 
@@ -381,20 +303,13 @@
         .execLocallyAndUpload(
             eq(spawn),
             eq(policy),
-            any(SortedMap.class),
+            any(),
             eq(cache),
-            any(ActionKey.class),
-            any(Action.class),
-            any(Command.class),
+            any(),
+            any(),
+            any(),
             /* uploadLocalResults= */ eq(true));
-    verify(cache)
-        .upload(
-            any(ActionKey.class),
-            any(Action.class),
-            any(Command.class),
-            any(Path.class),
-            any(Collection.class),
-            any(FileOutErr.class));
+    verify(cache).upload(any(), any(), any(), any(), any(), any());
     verify(cache, never()).download(any(ActionResult.class), any(Path.class), eq(outErr));
   }
 
@@ -406,21 +321,7 @@
     ActionResult failedAction = ActionResult.newBuilder().setExitCode(1).build();
     when(cache.getCachedActionResult(any(ActionKey.class))).thenReturn(failedAction);
 
-    RemoteSpawnRunner runner =
-        new RemoteSpawnRunner(
-            execRoot,
-            options,
-            Options.getDefaults(ExecutionOptions.class),
-            new AtomicReference<>(localRunner),
-            true,
-            /* cmdlineReporter= */ null,
-            "build-req-id",
-            "command-id",
-            cache,
-            executor,
-            retrier,
-            digestUtil,
-            logDir);
+    RemoteSpawnRunner runner = newSpawnRunner();
 
     ExecuteResponse succeeded =
         ExecuteResponse.newBuilder()
@@ -438,32 +339,17 @@
   }
 
   @Test
-  @SuppressWarnings("unchecked")
   public void printWarningIfCacheIsDown() throws Exception {
     // If we try to upload to a local cache, that is down a warning should be printed.
 
-    options.remoteUploadLocalResults = true;
-    options.remoteLocalFallback = true;
+    remoteOptions.remoteUploadLocalResults = true;
+    remoteOptions.remoteLocalFallback = true;
 
     Reporter reporter = new Reporter(new EventBus());
     StoredEventHandler eventHandler = new StoredEventHandler();
     reporter.addHandler(eventHandler);
 
-    RemoteSpawnRunner runner =
-        new RemoteSpawnRunner(
-            execRoot,
-            options,
-            Options.getDefaults(ExecutionOptions.class),
-            new AtomicReference<>(localRunner),
-            false,
-            reporter,
-            "build-req-id",
-            "command-id",
-            cache,
-            null,
-            retrier,
-            digestUtil,
-            logDir);
+    RemoteSpawnRunner runner = newSpawnRunnerWithoutExecutor(reporter);
 
     Spawn spawn = newSimpleSpawn();
     SpawnExecutionContext policy = new FakeSpawnExecutionContext(spawn);
@@ -473,13 +359,7 @@
 
     doThrow(new IOException("cache down"))
         .when(cache)
-        .upload(
-            any(ActionKey.class),
-            any(Action.class),
-            any(Command.class),
-            any(Path.class),
-            any(Collection.class),
-            any(FileOutErr.class));
+        .upload(any(), any(), any(), any(), any(), any());
 
     SpawnResult res =
         new SpawnResult.Builder()
@@ -505,24 +385,10 @@
   public void noRemoteExecutorFallbackFails() throws Exception {
     // Errors from the fallback runner should be propogated out of the remote runner.
 
-    options.remoteUploadLocalResults = true;
-    options.remoteLocalFallback = true;
+    remoteOptions.remoteUploadLocalResults = true;
+    remoteOptions.remoteLocalFallback = true;
 
-    RemoteSpawnRunner runner =
-        new RemoteSpawnRunner(
-            execRoot,
-            options,
-            Options.getDefaults(ExecutionOptions.class),
-            new AtomicReference<>(localRunner),
-            true,
-            /*cmdlineReporter=*/ null,
-            "build-req-id",
-            "command-id",
-            cache,
-            null,
-            retrier,
-            digestUtil,
-            logDir);
+    RemoteSpawnRunner runner = newSpawnRunnerWithoutExecutor();
 
     Spawn spawn = newSimpleSpawn();
     SpawnExecutionContext policy = new FakeSpawnExecutionContext(spawn);
@@ -546,24 +412,10 @@
   public void remoteCacheErrorFallbackFails() throws Exception {
     // Errors from the fallback runner should be propogated out of the remote runner.
 
-    options.remoteUploadLocalResults = true;
-    options.remoteLocalFallback = true;
+    remoteOptions.remoteUploadLocalResults = true;
+    remoteOptions.remoteLocalFallback = true;
 
-    RemoteSpawnRunner runner =
-        new RemoteSpawnRunner(
-            execRoot,
-            options,
-            Options.getDefaults(ExecutionOptions.class),
-            new AtomicReference<>(localRunner),
-            true,
-            /*cmdlineReporter=*/ null,
-            "build-req-id",
-            "command-id",
-            cache,
-            null,
-            retrier,
-            digestUtil,
-            logDir);
+    RemoteSpawnRunner runner = newSpawnRunnerWithoutExecutor();
 
     Spawn spawn = newSimpleSpawn();
     SpawnExecutionContext policy = new FakeSpawnExecutionContext(spawn);
@@ -585,23 +437,9 @@
 
   @Test
   public void testLocalFallbackFailureRemoteExecutorFailure() throws Exception {
-    options.remoteLocalFallback = true;
+    remoteOptions.remoteLocalFallback = true;
 
-    RemoteSpawnRunner runner =
-        new RemoteSpawnRunner(
-            execRoot,
-            options,
-            Options.getDefaults(ExecutionOptions.class),
-            new AtomicReference<>(localRunner),
-            true,
-            /*cmdlineReporter=*/ null,
-            "build-req-id",
-            "command-id",
-            cache,
-            executor,
-            retrier,
-            digestUtil,
-            logDir);
+    RemoteSpawnRunner runner = newSpawnRunner();
 
     when(cache.getCachedActionResult(any(ActionKey.class))).thenReturn(null);
     when(executor.executeRemotely(any(ExecuteRequest.class))).thenThrow(new IOException());
@@ -624,22 +462,7 @@
 
   @Test
   public void testHumanReadableServerLogsSavedForFailingAction() throws Exception {
-    RemoteSpawnRunner runner =
-        new RemoteSpawnRunner(
-            execRoot,
-            Options.getDefaults(RemoteOptions.class),
-            Options.getDefaults(ExecutionOptions.class),
-            new AtomicReference<>(localRunner),
-            true,
-            /*cmdlineReporter=*/ null,
-            "build-req-id",
-            "command-id",
-            cache,
-            executor,
-            retrier,
-            digestUtil,
-            logDir);
-
+    RemoteSpawnRunner runner = newSpawnRunner();
     Digest logDigest = digestUtil.computeAsUtf8("bla");
     Path logPath = logDir.getRelative(simpleActionId).getRelative("logname");
     when(executor.executeRemotely(any(ExecuteRequest.class)))
@@ -666,22 +489,7 @@
 
   @Test
   public void testHumanReadableServerLogsSavedForFailingActionWithStatus() throws Exception {
-    RemoteSpawnRunner runner =
-        new RemoteSpawnRunner(
-            execRoot,
-            Options.getDefaults(RemoteOptions.class),
-            Options.getDefaults(ExecutionOptions.class),
-            new AtomicReference<>(localRunner),
-            true,
-            /*cmdlineReporter=*/ null,
-            "build-req-id",
-            "command-id",
-            cache,
-            executor,
-            retrier,
-            digestUtil,
-            logDir);
-
+    RemoteSpawnRunner runner = newSpawnRunner();
     Digest logDigest = digestUtil.computeAsUtf8("bla");
     Path logPath = logDir.getRelative(simpleActionId).getRelative("logname");
     com.google.rpc.Status timeoutStatus =
@@ -710,30 +518,14 @@
 
   @Test
   public void testNonHumanReadableServerLogsNotSaved() throws Exception {
-    RemoteSpawnRunner runner =
-        new RemoteSpawnRunner(
-            execRoot,
-            Options.getDefaults(RemoteOptions.class),
-            Options.getDefaults(ExecutionOptions.class),
-            new AtomicReference<>(localRunner),
-            true,
-            /*cmdlineReporter=*/ null,
-            "build-req-id",
-            "command-id",
-            cache,
-            executor,
-            retrier,
-            digestUtil,
-            logDir);
+    RemoteSpawnRunner runner = newSpawnRunner();
 
     Digest logDigest = digestUtil.computeAsUtf8("bla");
     ActionResult result = ActionResult.newBuilder().setExitCode(31).build();
     when(executor.executeRemotely(any(ExecuteRequest.class)))
         .thenReturn(
             ExecuteResponse.newBuilder()
-                .putServerLogs(
-                    "logname",
-                    LogFile.newBuilder().setDigest(logDigest).build())
+                .putServerLogs("logname", LogFile.newBuilder().setDigest(logDigest).build())
                 .setResult(result)
                 .build());
 
@@ -750,21 +542,7 @@
 
   @Test
   public void testServerLogsNotSavedForSuccessfulAction() throws Exception {
-    RemoteSpawnRunner runner =
-        new RemoteSpawnRunner(
-            execRoot,
-            Options.getDefaults(RemoteOptions.class),
-            Options.getDefaults(ExecutionOptions.class),
-            new AtomicReference<>(localRunner),
-            true,
-            /*cmdlineReporter=*/ null,
-            "build-req-id",
-            "command-id",
-            cache,
-            executor,
-            retrier,
-            digestUtil,
-            logDir);
+    RemoteSpawnRunner runner = newSpawnRunner();
 
     Digest logDigest = digestUtil.computeAsUtf8("bla");
     ActionResult result = ActionResult.newBuilder().setExitCode(0).build();
@@ -792,21 +570,7 @@
   public void cacheDownloadFailureTriggersRemoteExecution() throws Exception {
     // If downloading a cached action fails, remote execution should be tried.
 
-    RemoteSpawnRunner runner =
-        new RemoteSpawnRunner(
-            execRoot,
-            options,
-            Options.getDefaults(ExecutionOptions.class),
-            new AtomicReference<>(localRunner),
-            true,
-            /*cmdlineReporter=*/ null,
-            "build-req-id",
-            "command-id",
-            cache,
-            executor,
-            retrier,
-            digestUtil,
-            logDir);
+    RemoteSpawnRunner runner = newSpawnRunner();
 
     ActionResult cachedResult = ActionResult.newBuilder().setExitCode(0).build();
     when(cache.getCachedActionResult(any(ActionKey.class))).thenReturn(cachedResult);
@@ -835,21 +599,7 @@
     // If downloading an action result fails, remote execution should be retried
     // with skip cache lookup enabled
 
-    RemoteSpawnRunner runner =
-        new RemoteSpawnRunner(
-            execRoot,
-            options,
-            Options.getDefaults(ExecutionOptions.class),
-            new AtomicReference<>(localRunner),
-            true,
-            /*cmdlineReporter=*/ null,
-            "build-req-id",
-            "command-id",
-            cache,
-            executor,
-            retrier,
-            digestUtil,
-            logDir);
+    RemoteSpawnRunner runner = newSpawnRunner();
 
     when(cache.getCachedActionResult(any(ActionKey.class))).thenReturn(null);
     ActionResult cachedResult = ActionResult.newBuilder().setExitCode(0).build();
@@ -887,23 +637,9 @@
   public void testRemoteExecutionTimeout() throws Exception {
     // If remote execution times out the SpawnResult status should be TIMEOUT.
 
-    options.remoteLocalFallback = false;
+    remoteOptions.remoteLocalFallback = false;
 
-    RemoteSpawnRunner runner =
-        new RemoteSpawnRunner(
-            execRoot,
-            options,
-            Options.getDefaults(ExecutionOptions.class),
-            new AtomicReference<>(localRunner),
-            true,
-            /*cmdlineReporter=*/ null,
-            "build-req-id",
-            "command-id",
-            cache,
-            executor,
-            retrier,
-            digestUtil,
-            logDir);
+    RemoteSpawnRunner runner = newSpawnRunner();
 
     ActionResult cachedResult = ActionResult.newBuilder().setExitCode(0).build();
     when(cache.getCachedActionResult(any(ActionKey.class))).thenReturn(null);
@@ -934,23 +670,9 @@
     // If remote execution times out the SpawnResult status should be TIMEOUT, regardess of local
     // fallback option.
 
-    options.remoteLocalFallback = true;
+    remoteOptions.remoteLocalFallback = true;
 
-    RemoteSpawnRunner runner =
-        new RemoteSpawnRunner(
-            execRoot,
-            options,
-            Options.getDefaults(ExecutionOptions.class),
-            new AtomicReference<>(localRunner),
-            true,
-            /*cmdlineReporter=*/ null,
-            "build-req-id",
-            "command-id",
-            cache,
-            executor,
-            retrier,
-            digestUtil,
-            logDir);
+    RemoteSpawnRunner runner = newSpawnRunner();
 
     ActionResult cachedResult = ActionResult.newBuilder().setExitCode(0).build();
     when(cache.getCachedActionResult(any(ActionKey.class))).thenReturn(null);
@@ -979,28 +701,16 @@
 
   @Test
   public void testRemoteExecutionCommandFailureDoesNotTriggerFallback() throws Exception {
-    options.remoteLocalFallback = true;
+    remoteOptions.remoteLocalFallback = true;
 
-    RemoteSpawnRunner runner =
-        new RemoteSpawnRunner(
-            execRoot,
-            options,
-            Options.getDefaults(ExecutionOptions.class),
-            new AtomicReference<>(localRunner),
-            true,
-            /*cmdlineReporter=*/ null,
-            "build-req-id",
-            "command-id",
-            cache,
-            executor,
-            retrier,
-            digestUtil,
-            logDir);
+    RemoteSpawnRunner runner = newSpawnRunner();
 
     ActionResult cachedResult = ActionResult.newBuilder().setExitCode(0).build();
     when(cache.getCachedActionResult(any(ActionKey.class))).thenReturn(null);
-    ExecuteResponse failed = ExecuteResponse.newBuilder().setResult(
-        ActionResult.newBuilder().setExitCode(33).build()).build();
+    ExecuteResponse failed =
+        ExecuteResponse.newBuilder()
+            .setResult(ActionResult.newBuilder().setExitCode(33).build())
+            .build();
     when(executor.executeRemotely(any(ExecuteRequest.class))).thenReturn(failed);
 
     Spawn spawn = newSimpleSpawn();
@@ -1021,23 +731,9 @@
     // If we get a failure due to the remote cache not working, the exit code should be
     // ExitCode.REMOTE_ERROR.
 
-    options.remoteLocalFallback = false;
+    remoteOptions.remoteLocalFallback = false;
 
-    RemoteSpawnRunner runner =
-        new RemoteSpawnRunner(
-            execRoot,
-            options,
-            Options.getDefaults(ExecutionOptions.class),
-            new AtomicReference<>(localRunner),
-            true,
-            /*cmdlineReporter=*/ null,
-            "build-req-id",
-            "command-id",
-            cache,
-            executor,
-            retrier,
-            digestUtil,
-            logDir);
+    RemoteSpawnRunner runner = newSpawnRunner();
 
     when(cache.getCachedActionResult(any(ActionKey.class))).thenReturn(null);
     when(executor.executeRemotely(any(ExecuteRequest.class))).thenThrow(new IOException("reasons"));
@@ -1060,23 +756,9 @@
     // If we get a failure due to the remote executor not working, the exit code should be
     // ExitCode.REMOTE_ERROR.
 
-    options.remoteLocalFallback = false;
+    remoteOptions.remoteLocalFallback = false;
 
-    RemoteSpawnRunner runner =
-        new RemoteSpawnRunner(
-            execRoot,
-            options,
-            Options.getDefaults(ExecutionOptions.class),
-            new AtomicReference<>(localRunner),
-            true,
-            /*cmdlineReporter=*/ null,
-            "build-req-id",
-            "command-id",
-            cache,
-            executor,
-            retrier,
-            digestUtil,
-            logDir);
+    RemoteSpawnRunner runner = newSpawnRunner();
 
     when(cache.getCachedActionResult(any(ActionKey.class))).thenThrow(new IOException("reasons"));
 
@@ -1170,27 +852,12 @@
   @Test
   public void testDownloadMinimalOnCacheHit() throws Exception {
     // arrange
-    RemoteOptions options = Options.getDefaults(RemoteOptions.class);
-    options.remoteOutputsMode = RemoteOutputsMode.MINIMAL;
+    remoteOptions.remoteOutputsMode = RemoteOutputsMode.MINIMAL;
 
     ActionResult succeededAction = ActionResult.newBuilder().setExitCode(0).build();
     when(cache.getCachedActionResult(any(ActionKey.class))).thenReturn(succeededAction);
 
-    RemoteSpawnRunner runner =
-        new RemoteSpawnRunner(
-            execRoot,
-            options,
-            Options.getDefaults(ExecutionOptions.class),
-            new AtomicReference<>(localRunner),
-            true,
-            /* cmdlineReporter= */ null,
-            "build-req-id",
-            "command-id",
-            cache,
-            executor,
-            retrier,
-            digestUtil,
-            logDir);
+    RemoteSpawnRunner runner = newSpawnRunner();
 
     Spawn spawn = newSimpleSpawn();
     SpawnExecutionContext policy = new FakeSpawnExecutionContext(spawn);
@@ -1208,28 +875,13 @@
   @Test
   public void testDownloadMinimalOnCacheMiss() throws Exception {
     // arrange
-    RemoteOptions options = Options.getDefaults(RemoteOptions.class);
-    options.remoteOutputsMode = RemoteOutputsMode.MINIMAL;
+    remoteOptions.remoteOutputsMode = RemoteOutputsMode.MINIMAL;
 
     ActionResult succeededAction = ActionResult.newBuilder().setExitCode(0).build();
     ExecuteResponse succeeded = ExecuteResponse.newBuilder().setResult(succeededAction).build();
     when(executor.executeRemotely(any(ExecuteRequest.class))).thenReturn(succeeded);
 
-    RemoteSpawnRunner runner =
-        new RemoteSpawnRunner(
-            execRoot,
-            options,
-            Options.getDefaults(ExecutionOptions.class),
-            new AtomicReference<>(localRunner),
-            true,
-            /* cmdlineReporter= */ null,
-            "build-req-id",
-            "command-id",
-            cache,
-            executor,
-            retrier,
-            digestUtil,
-            logDir);
+    RemoteSpawnRunner runner = newSpawnRunner();
 
     Spawn spawn = newSimpleSpawn();
     SpawnExecutionContext policy = new FakeSpawnExecutionContext(spawn);
@@ -1248,8 +900,7 @@
   @Test
   public void testDownloadMinimalIoError() throws Exception {
     // arrange
-    RemoteOptions options = Options.getDefaults(RemoteOptions.class);
-    options.remoteOutputsMode = RemoteOutputsMode.MINIMAL;
+    remoteOptions.remoteOutputsMode = RemoteOutputsMode.MINIMAL;
 
     ActionResult succeededAction = ActionResult.newBuilder().setExitCode(0).build();
     when(cache.getCachedActionResult(any(ActionKey.class))).thenReturn(succeededAction);
@@ -1257,21 +908,7 @@
     when(cache.downloadMinimal(any(), anyCollection(), any(), any(), any(), any()))
         .thenThrow(downloadFailure);
 
-    RemoteSpawnRunner runner =
-        new RemoteSpawnRunner(
-            execRoot,
-            options,
-            Options.getDefaults(ExecutionOptions.class),
-            new AtomicReference<>(localRunner),
-            /* verboseFailures= */ false,
-            /* cmdlineReporter= */ null,
-            "build-req-id",
-            "command-id",
-            cache,
-            executor,
-            retrier,
-            digestUtil,
-            logDir);
+    RemoteSpawnRunner runner = newSpawnRunner();
 
     Spawn spawn = newSimpleSpawn();
     SpawnExecutionContext policy = new FakeSpawnExecutionContext(spawn);
@@ -1292,19 +929,48 @@
   private static Spawn newSimpleSpawn() {
     return new SimpleSpawn(
         new FakeOwner("foo", "bar"),
-            /*arguments=*/ ImmutableList.of(),
-            /*environment=*/ ImmutableMap.of(),
-            /*executionInfo=*/ ImmutableMap.of(),
-            /*inputs=*/ ImmutableList.of(),
-            /*outputs=*/ ImmutableList.<ActionInput>of(),
+        /*arguments=*/ ImmutableList.of(),
+        /*environment=*/ ImmutableMap.of(),
+        /*executionInfo=*/ ImmutableMap.of(),
+        /*inputs=*/ ImmutableList.of(),
+        /*outputs=*/ ImmutableList.<ActionInput>of(),
         ResourceSet.ZERO);
   }
 
+  private RemoteSpawnRunner newSpawnRunner() {
+    return newSpawnRunner(/* verboseFailures= */ false, executor, /* reporter= */ null);
+  }
+
+  private RemoteSpawnRunner newSpawnRunner(
+      boolean verboseFailures, @Nullable GrpcRemoteExecutor executor, @Nullable Reporter reporter) {
+    return new RemoteSpawnRunner(
+        execRoot,
+        remoteOptions,
+        Options.getDefaults(ExecutionOptions.class),
+        new AtomicReference<>(localRunner),
+        verboseFailures,
+        reporter,
+        "build-req-id",
+        "command-id",
+        cache,
+        executor,
+        retrier,
+        digestUtil,
+        logDir);
+  }
+
+  private RemoteSpawnRunner newSpawnRunnerWithoutExecutor() {
+    return newSpawnRunner(/* verboseFailures= */ false, /* executor= */ null, /* reporter= */ null);
+  }
+
+  private RemoteSpawnRunner newSpawnRunnerWithoutExecutor(Reporter reporter) {
+    return newSpawnRunner(/* verboseFailures= */ false, /* executor= */ null, reporter);
+  }
+
   // TODO(buchgr): Extract a common class to be used for testing.
   class FakeSpawnExecutionContext implements SpawnExecutionContext {
 
-    private final ArtifactExpander artifactExpander =
-        (artifact, output) -> output.add(artifact);
+    private final ArtifactExpander artifactExpander = (artifact, output) -> output.add(artifact);
 
     private final Spawn spawn;
 
@@ -1356,8 +1022,8 @@
     public SortedMap<PathFragment, ActionInput> getInputMapping(
         boolean expandTreeArtifactsInRunfiles) throws IOException {
       return new SpawnInputExpander(execRoot, /*strict*/ false)
-          .getInputMapping(spawn, artifactExpander, ArtifactPathResolver.IDENTITY, fakeFileCache,
-              true);
+          .getInputMapping(
+              spawn, artifactExpander, ArtifactPathResolver.IDENTITY, fakeFileCache, true);
     }
 
     @Override
