diff --git a/src/test/java/com/google/devtools/build/lib/actions/ArtifactFactoryTest.java b/src/test/java/com/google/devtools/build/lib/actions/ArtifactFactoryTest.java
index b8a735d..d0b235d 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/ArtifactFactoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/ArtifactFactoryTest.java
@@ -17,7 +17,7 @@
 import static com.google.common.truth.Truth.assertWithMessage;
 import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.NULL_ACTION_OWNER;
 import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.NULL_ARTIFACT_OWNER;
-import static org.junit.Assert.fail;
+import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -229,14 +229,15 @@
     actionGraph.registerAction(originalAction);
 
     // Creating a second Action referring to the Artifact should create a conflict.
-    try {
-      Action action = new ActionsTestUtil.NullAction(NULL_ACTION_OWNER, a, b);
-      actionGraph.registerAction(action);
-      fail();
-    } catch (ActionConflictException e) {
-      assertThat(e.getArtifact()).isSameAs(a);
-      assertThat(actionGraph.getGeneratingAction(a)).isSameAs(originalAction);
-    }
+    Action action = new ActionsTestUtil.NullAction(NULL_ACTION_OWNER, a, b);
+    ActionConflictException e =
+        assertThrows(
+            ActionConflictException.class,
+            () -> {
+              actionGraph.registerAction(action);
+            });
+    assertThat(e.getArtifact()).isSameAs(a);
+    assertThat(actionGraph.getGeneratingAction(a)).isSameAs(originalAction);
   }
 
   private static class MockPackageRootResolver implements PackageRootResolver {
diff --git a/src/test/java/com/google/devtools/build/lib/actions/ArtifactRootTest.java b/src/test/java/com/google/devtools/build/lib/actions/ArtifactRootTest.java
index 5d36934..f486ba9 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/ArtifactRootTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/ArtifactRootTest.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.lib.actions;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
+import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
 
 import com.google.common.testing.EqualsTester;
 import com.google.devtools.build.lib.testutil.Scratch;
@@ -43,11 +43,7 @@
 
   @Test
   public void testBadAsSourceRoot() {
-    try {
-      ArtifactRoot.asSourceRoot(null);
-      fail();
-    } catch (NullPointerException expected) {
-    }
+    assertThrows(NullPointerException.class, () -> ArtifactRoot.asSourceRoot(null));
   }
 
   @Test
@@ -63,43 +59,29 @@
 
   @Test
   public void testBadAsDerivedRoot() throws IOException {
-    try {
-      Path execRoot = scratch.dir("/exec");
-      Path outsideDir = scratch.dir("/not_exec");
-      ArtifactRoot.asDerivedRoot(execRoot, outsideDir);
-      fail();
-    } catch (IllegalArgumentException expected) {
-    }
+    Path execRoot = scratch.dir("/exec");
+    Path outsideDir = scratch.dir("/not_exec");
+    assertThrows(
+        IllegalArgumentException.class, () -> ArtifactRoot.asDerivedRoot(execRoot, outsideDir));
   }
 
   @Test
   public void testBadAsDerivedRootSameForBoth() throws IOException {
-    try {
-      Path execRoot = scratch.dir("/exec");
-      ArtifactRoot.asDerivedRoot(execRoot, execRoot);
-      fail();
-    } catch (IllegalArgumentException expected) {
-    }
+    Path execRoot = scratch.dir("/exec");
+    assertThrows(
+        IllegalArgumentException.class, () -> ArtifactRoot.asDerivedRoot(execRoot, execRoot));
   }
 
   @Test
   public void testBadAsDerivedRootNullDir() throws IOException {
-    try {
-      Path execRoot = scratch.dir("/exec");
-      ArtifactRoot.asDerivedRoot(execRoot, null);
-      fail();
-    } catch (NullPointerException expected) {
-    }
+    Path execRoot = scratch.dir("/exec");
+    assertThrows(NullPointerException.class, () -> ArtifactRoot.asDerivedRoot(execRoot, null));
   }
 
   @Test
   public void testBadAsDerivedRootNullExecRoot() throws IOException {
-    try {
-      Path execRoot = scratch.dir("/exec");
-      ArtifactRoot.asDerivedRoot(null, execRoot);
-      fail();
-    } catch (NullPointerException expected) {
-    }
+    Path execRoot = scratch.dir("/exec");
+    assertThrows(NullPointerException.class, () -> ArtifactRoot.asDerivedRoot(null, execRoot));
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java b/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java
index 8aad11d..cc3587e 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.lib.actions;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
+import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -64,10 +64,9 @@
   public void testConstruction_badRootDir() throws IOException {
     Path f1 = scratch.file("/exec/dir/file.ext");
     Path bogusDir = scratch.file("/exec/dir/bogus");
-    try {
-      new Artifact(ArtifactRoot.asDerivedRoot(execDir, bogusDir), f1.relativeTo(execDir));
-      fail("Expected IllegalArgumentException constructing artifact with a bad root dir");
-    } catch (IllegalArgumentException expected) {}
+    assertThrows(
+        IllegalArgumentException.class,
+        () -> new Artifact(ArtifactRoot.asDerivedRoot(execDir, bogusDir), f1.relativeTo(execDir)));
   }
 
   @Test
@@ -115,11 +114,7 @@
   @Test
   public void testRootPrefixedExecPath_nullRootDir() throws IOException {
     Path f1 = scratch.file("/exec/dir/file.ext");
-    try {
-      new Artifact(null, f1.relativeTo(execDir));
-      fail("Expected NullPointerException creating artifact with null root");
-    } catch (NullPointerException expected) {
-    }
+    assertThrows(NullPointerException.class, () -> new Artifact(null, f1.relativeTo(execDir)));
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java b/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java
index 72c782f..f387863 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java
@@ -15,6 +15,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.lib.analysis.actions.CustomCommandLine.builder;
+import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Joiner;
@@ -965,12 +966,7 @@
             .addPlaceholderTreeArtifactExecPath("--argTwo", treeArtifactTwo)
             .build();
 
-    try {
-      commandLineTemplate.arguments();
-      fail("No substitution map provided, expected NullPointerException");
-    } catch (NullPointerException e) {
-      // expected
-    }
+    assertThrows(NullPointerException.class, () -> commandLineTemplate.arguments());
   }
 
   private SpecialArtifact createTreeArtifact(String rootRelativePath) {
diff --git a/src/test/java/com/google/devtools/build/lib/actions/ExecutableSymlinkActionTest.java b/src/test/java/com/google/devtools/build/lib/actions/ExecutableSymlinkActionTest.java
index f724072..48a99c0 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/ExecutableSymlinkActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/ExecutableSymlinkActionTest.java
@@ -16,7 +16,7 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.NULL_ACTION_OWNER;
-import static org.junit.Assert.fail;
+import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.actions.util.DummyExecutor;
@@ -92,12 +92,9 @@
     Artifact input = new Artifact(dir, inputRoot);
     Artifact output = new Artifact(outputRoot.getRoot().getRelative("some-output"), outputRoot);
     SymlinkAction action = SymlinkAction.toExecutable(NULL_ACTION_OWNER, input, output, "progress");
-    try {
-      action.execute(createContext());
-      fail();
-    } catch (ActionExecutionException e) {
-      assertThat(e).hasMessageThat().contains("'some-dir' is not a file");
-    }
+    ActionExecutionException e =
+        assertThrows(ActionExecutionException.class, () -> action.execute(createContext()));
+    assertThat(e).hasMessageThat().contains("'some-dir' is not a file");
   }
 
   @Test
@@ -108,16 +105,13 @@
     Artifact input = new Artifact(file, inputRoot);
     Artifact output = new Artifact(outputRoot.getRoot().getRelative("some-output"), outputRoot);
     SymlinkAction action = SymlinkAction.toExecutable(NULL_ACTION_OWNER, input, output, "progress");
-    try {
-      action.execute(createContext());
-      fail();
-    } catch (ActionExecutionException e) {
-      String want = "'some-file' is not executable";
+    ActionExecutionException e =
+        assertThrows(ActionExecutionException.class, () -> action.execute(createContext()));
+    String want = "'some-file' is not executable";
       String got = e.getMessage();
-      assertWithMessage(String.format("got %s, want %s", got, want))
-          .that(got.contains(want))
-          .isTrue();
-    }
+    assertWithMessage(String.format("got %s, want %s", got, want))
+        .that(got.contains(want))
+        .isTrue();
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/actions/FailActionTest.java b/src/test/java/com/google/devtools/build/lib/actions/FailActionTest.java
index d640043..4204aef 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/FailActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/FailActionTest.java
@@ -15,7 +15,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.NULL_ACTION_OWNER;
-import static org.junit.Assert.fail;
+import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.testutil.Scratch;
@@ -54,12 +54,9 @@
 
   @Test
   public void testExecutingItYieldsExceptionWithErrorMessage() {
-    try {
-      failAction.execute(null);
-      fail();
-    } catch (ActionExecutionException e) {
-      assertThat(e).hasMessageThat().isEqualTo(errorMessage);
-    }
+    ActionExecutionException e =
+        assertThrows(ActionExecutionException.class, () -> failAction.execute(null));
+    assertThat(e).hasMessageThat().isEqualTo(errorMessage);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/actions/ResourceManagerTest.java b/src/test/java/com/google/devtools/build/lib/actions/ResourceManagerTest.java
index d294afd1..876a649 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/ResourceManagerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/ResourceManagerTest.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.lib.actions;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
+import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
@@ -312,12 +312,7 @@
           @Override
           public void runTest() {
             Thread.currentThread().interrupt();
-            try {
-              acquire(1999, 0, 0);
-              fail("Didn't throw interrupted exception");
-            } catch (InterruptedException e) {
-              // Expected.
-            }
+            assertThrows(InterruptedException.class, () -> acquire(1999, 0, 0));
           }
         };
     thread1.start();
diff --git a/src/test/java/com/google/devtools/build/skyframe/CycleDeduperTest.java b/src/test/java/com/google/devtools/build/skyframe/CycleDeduperTest.java
index bd14fe7..28f8065 100644
--- a/src/test/java/com/google/devtools/build/skyframe/CycleDeduperTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/CycleDeduperTest.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
+import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
 
 import com.google.common.collect.ImmutableList;
 import org.junit.Test;
@@ -42,21 +42,13 @@
 
   @Test
   public void badCycle_Empty() throws Exception {
-    try {
-      cycleDeduper.seen(ImmutableList.<String>of());
-      fail();
-    } catch (IllegalStateException e) {
-      // Expected.
-    }
+    assertThrows(IllegalStateException.class, () -> cycleDeduper.seen(ImmutableList.<String>of()));
   }
 
   @Test
   public void badCycle_NonUniqueMembers() throws Exception {
-    try {
-      cycleDeduper.seen(ImmutableList.<String>of("a", "b", "a"));
-      fail();
-    } catch (IllegalStateException e) {
-      // Expected.
-    }
+    assertThrows(
+        IllegalStateException.class,
+        () -> cycleDeduper.seen(ImmutableList.<String>of("a", "b", "a")));
   }
 }
diff --git a/src/test/java/com/google/devtools/build/skyframe/EagerInvalidatorTest.java b/src/test/java/com/google/devtools/build/skyframe/EagerInvalidatorTest.java
index a24a9bc..aaf5db5 100644
--- a/src/test/java/com/google/devtools/build/skyframe/EagerInvalidatorTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/EagerInvalidatorTest.java
@@ -14,9 +14,9 @@
 package com.google.devtools.build.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
 import static com.google.devtools.build.skyframe.GraphTester.CONCATENATE;
 import static com.google.devtools.build.skyframe.GraphTester.NODE_TYPE;
-import static org.junit.Assert.fail;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -346,7 +346,7 @@
     eval(/*keepGoing=*/false, parent);
     final Thread mainThread = Thread.currentThread();
     final AtomicReference<SkyKey> badKey = new AtomicReference<>();
-    DirtyTrackingProgressReceiver receiver =
+    final DirtyTrackingProgressReceiver receiver =
         new DirtyTrackingProgressReceiver(
             new EvaluationProgressReceiver.NullEvaluationProgressReceiver() {
               @Override
@@ -373,25 +373,21 @@
                 }
               }
             });
-    try {
-      invalidateWithoutError(receiver, child);
-      fail();
-    } catch (InterruptedException e) {
-      // Expected.
-    }
+    assertThrows(InterruptedException.class, () -> invalidateWithoutError(receiver, child));
     assertThat(badKey.get()).isNull();
     assertThat(state.isEmpty()).isFalse();
     final Set<SkyKey> invalidated = Sets.newConcurrentHashSet();
     assertThat(isInvalidated(parent)).isFalse();
     assertThat(graph.get(null, Reason.OTHER, parent).getValue()).isNotNull();
-    receiver = new DirtyTrackingProgressReceiver(
-        new EvaluationProgressReceiver.NullEvaluationProgressReceiver() {
-      @Override
-      public void invalidated(SkyKey skyKey, InvalidationState state) {
-        invalidated.add(skyKey);
-      }
-    });
-    invalidateWithoutError(receiver);
+    final DirtyTrackingProgressReceiver receiver2 =
+        new DirtyTrackingProgressReceiver(
+            new EvaluationProgressReceiver.NullEvaluationProgressReceiver() {
+              @Override
+              public void invalidated(SkyKey skyKey, InvalidationState state) {
+                invalidated.add(skyKey);
+              }
+            });
+    invalidateWithoutError(receiver2);
     assertThat(invalidated).contains(parent);
     assertThat(state.getInvalidationsForTesting()).isEmpty();
 
diff --git a/src/test/java/com/google/devtools/build/skyframe/EmptySkyValueTest.java b/src/test/java/com/google/devtools/build/skyframe/EmptySkyValueTest.java
index 49a763e..7ec95b0 100644
--- a/src/test/java/com/google/devtools/build/skyframe/EmptySkyValueTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/EmptySkyValueTest.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
+import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -31,12 +31,10 @@
   public void testNotSerializable() throws IOException {
     ObjectOutputStream objOut = new ObjectOutputStream(new ByteArrayOutputStream());
 
-    try {
-      objOut.writeObject(EmptySkyValue.INSTANCE);
-      fail("Expected exception");
-    } catch (UnsupportedOperationException e) {
-      assertThat(e).hasMessageThat().isEqualTo("Java serialization not supported");
-    }
+    UnsupportedOperationException e =
+        assertThrows(
+            UnsupportedOperationException.class, () -> objOut.writeObject(EmptySkyValue.INSTANCE));
+    assertThat(e).hasMessageThat().isEqualTo("Java serialization not supported");
   }
 
 }
diff --git a/src/test/java/com/google/devtools/build/skyframe/ErrorTransienceValueTest.java b/src/test/java/com/google/devtools/build/skyframe/ErrorTransienceValueTest.java
index 7439a25..1ae1185 100644
--- a/src/test/java/com/google/devtools/build/skyframe/ErrorTransienceValueTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/ErrorTransienceValueTest.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
+import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -31,22 +31,17 @@
   public void testNotSerializable() throws IOException {
     ObjectOutputStream objOut = new ObjectOutputStream(new ByteArrayOutputStream());
 
-    try {
-      objOut.writeObject(ErrorTransienceValue.INSTANCE);
-      fail("Expected exception");
-    } catch (UnsupportedOperationException e) {
-      assertThat(e).hasMessageThat().isEqualTo("Java serialization not supported");
-    }
+    UnsupportedOperationException e =
+        assertThrows(
+            UnsupportedOperationException.class,
+            () -> objOut.writeObject(ErrorTransienceValue.INSTANCE));
+    assertThat(e).hasMessageThat().isEqualTo("Java serialization not supported");
   }
 
   @Test
   public void testHashCodeNotSupported() {
-    try {
-      ErrorTransienceValue.INSTANCE.hashCode();
-      fail("Expected exception");
-    } catch (UnsupportedOperationException e) {
-      // Expected.
-    }
+    assertThrows(
+        UnsupportedOperationException.class, () -> ErrorTransienceValue.INSTANCE.hashCode());
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/skyframe/InMemoryNodeEntryTest.java b/src/test/java/com/google/devtools/build/skyframe/InMemoryNodeEntryTest.java
index 137d8d3..64fd23b 100644
--- a/src/test/java/com/google/devtools/build/skyframe/InMemoryNodeEntryTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/InMemoryNodeEntryTest.java
@@ -15,8 +15,8 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
+import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
 import static com.google.devtools.build.skyframe.NodeEntrySubjectFactory.assertThatNodeEntry;
-import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
@@ -166,12 +166,9 @@
     NodeEntry entry = new InMemoryNodeEntry();
     entry.addReverseDepAndCheckIfDone(null); // Start evaluation.
     entry.markRebuilding();
-    try {
-      setValue(entry, /*value=*/null, /*errorInfo=*/null, /*graphVersion=*/0L);
-      fail();
-    } catch (IllegalStateException e) {
-      // Expected.
-    }
+    assertThrows(
+        IllegalStateException.class,
+        () -> setValue(entry, /*value=*/ null, /*errorInfo=*/ null, /*graphVersion=*/ 0L));
   }
 
   @Test
@@ -179,12 +176,7 @@
     InMemoryNodeEntry entry = new InMemoryNodeEntry();
     entry.addReverseDepAndCheckIfDone(null); // Start evaluation.
     entry.markRebuilding();
-    try {
-      entry.signalDep(ZERO_VERSION, null);
-      fail();
-    } catch (IllegalStateException e) {
-      // Expected.
-    }
+    assertThrows(IllegalStateException.class, () -> entry.signalDep(ZERO_VERSION, null));
   }
 
   @Test
@@ -194,12 +186,9 @@
     entry.markRebuilding();
     setValue(entry, new SkyValue() {}, /*errorInfo=*/ null, /*graphVersion=*/ 0L);
     assertThat(entry.isDone()).isTrue();
-    try {
-      setValue(entry, new SkyValue() {}, /*errorInfo=*/ null, /*graphVersion=*/ 1L);
-      fail();
-    } catch (IllegalStateException e) {
-      // Expected.
-    }
+    assertThrows(
+        IllegalStateException.class,
+        () -> setValue(entry, new SkyValue() {}, /*errorInfo=*/ null, /*graphVersion=*/ 1L));
   }
 
   @Test
@@ -211,12 +200,9 @@
     entry.markDirty(DirtyType.CHANGE);
     entry.addReverseDepAndCheckIfDone(null);
     entry.markRebuilding();
-    try {
-      setValue(entry, new IntegerValue(2), /*errorInfo=*/ null, /*graphVersion=*/ 0L);
-      fail();
-    } catch (ChangedValueAtSameVersionException e) {
-      // Expected.
-    }
+    assertThrows(
+        ChangedValueAtSameVersionException.class,
+        () -> setValue(entry, new IntegerValue(2), /*errorInfo=*/ null, /*graphVersion=*/ 0L));
   }
 
   @Test
@@ -378,12 +364,10 @@
     assertThat(entry.isDirty()).isFalse();
     assertThat(entry.isDone()).isTrue();
     entry.markDirty(DirtyType.CHANGE);
-    try {
-      entry.markDirty(DirtyType.CHANGE);
-      fail("Cannot mark entry changed twice");
-    } catch (IllegalStateException e) {
-      // Expected.
-    }
+    assertThrows(
+        "Cannot mark entry changed twice",
+        IllegalStateException.class,
+        () -> entry.markDirty(DirtyType.CHANGE));
   }
 
   @Test
@@ -396,12 +380,10 @@
     entry.signalDep(ZERO_VERSION, dep);
     setValue(entry, new SkyValue() {}, /*errorInfo=*/ null, /*graphVersion=*/ 0L);
     entry.markDirty(DirtyType.DIRTY);
-    try {
-      entry.markDirty(DirtyType.DIRTY);
-      fail("Cannot mark entry dirty twice");
-    } catch (IllegalStateException e) {
-      // Expected.
-    }
+    assertThrows(
+        "Cannot mark entry dirty twice",
+        IllegalStateException.class,
+        () -> entry.markDirty(DirtyType.DIRTY));
   }
 
   @Test
@@ -425,15 +407,14 @@
     SkyKey parent = key("parent");
     assertThat(entry.addReverseDepAndCheckIfDone(parent))
         .isEqualTo(DependencyState.NEEDS_SCHEDULING);
-    try {
-      entry.addReverseDepAndCheckIfDone(parent);
-      entry.markRebuilding();
-      assertThat(setValue(entry, new SkyValue() {}, /*errorInfo=*/null, /*graphVersion=*/0L))
-          .containsExactly(parent);
-      fail("Cannot add same dep twice");
-    } catch (IllegalStateException e) {
-      assertThat(e).hasMessageThat().contains("Duplicate reverse deps");
-    }
+    entry.addReverseDepAndCheckIfDone(parent);
+    entry.markRebuilding();
+    IllegalStateException e =
+        assertThrows(
+            "Cannot add same dep twice",
+            IllegalStateException.class,
+            () -> setValue(entry, new SkyValue() {}, /*errorInfo=*/ null, /*graphVersion=*/ 0L));
+    assertThat(e).hasMessageThat().contains("Duplicate reverse deps");
   }
 
   @Test
@@ -444,14 +425,13 @@
     setValue(entry, new SkyValue() {}, /*errorInfo=*/null, /*graphVersion=*/0L);
     SkyKey parent = key("parent");
     assertThat(entry.addReverseDepAndCheckIfDone(parent)).isEqualTo(DependencyState.DONE);
-    try {
-      entry.addReverseDepAndCheckIfDone(parent);
-      // We only check for duplicates when we request all the reverse deps.
-      entry.getReverseDepsForDoneEntry();
-      fail("Cannot add same dep twice");
-    } catch (IllegalStateException e) {
-      // Expected.
-    }
+    entry.addReverseDepAndCheckIfDone(parent);
+    assertThrows(
+        "Cannot add same dep twice",
+        IllegalStateException.class,
+        () ->
+            // We only check for duplicates when we request all the reverse deps.
+            entry.getReverseDepsForDoneEntry());
   }
 
   @Test
@@ -462,14 +442,13 @@
         .isEqualTo(DependencyState.NEEDS_SCHEDULING);
     entry.markRebuilding();
     setValue(entry, new SkyValue() {}, /*errorInfo=*/null, /*graphVersion=*/0L);
-    try {
-      entry.addReverseDepAndCheckIfDone(parent);
-      // We only check for duplicates when we request all the reverse deps.
-      entry.getReverseDepsForDoneEntry();
-      fail("Cannot add same dep twice");
-    } catch (IllegalStateException e) {
-      // Expected.
-    }
+    entry.addReverseDepAndCheckIfDone(parent);
+    assertThrows(
+        "Cannot add same dep twice",
+        IllegalStateException.class,
+        () ->
+            // We only check for duplicates when we request all the reverse deps.
+            entry.getReverseDepsForDoneEntry());
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java b/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java
index 1ddb6ae..6331052 100644
--- a/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java
@@ -16,6 +16,7 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 import static com.google.devtools.build.lib.testutil.EventIterableSubjectFactory.assertThatEvents;
+import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
 import static com.google.devtools.build.skyframe.ErrorInfoSubjectFactory.assertThatErrorInfo;
 import static com.google.devtools.build.skyframe.EvaluationResultSubjectFactory.assertThatEvaluationResult;
 import static com.google.devtools.build.skyframe.GraphTester.CONCATENATE;
@@ -341,12 +342,7 @@
   public void interruptBitCleared() throws Exception {
     SkyKey interruptKey = GraphTester.skyKey("interrupt");
     tester.getOrCreate(interruptKey).setBuilder(INTERRUPT_BUILDER);
-    try {
-      tester.eval(/*keepGoing=*/ true, interruptKey);
-      fail("Expected interrupt");
-    } catch (InterruptedException e) {
-      // Expected.
-    }
+    assertThrows(InterruptedException.class, () -> tester.eval(/*keepGoing=*/ true, interruptKey));
     assertThat(Thread.interrupted()).isFalse();
   }
 
@@ -391,17 +387,15 @@
                 null,
                 ImmutableList.<SkyKey>of()));
 
-    try {
-      // When it is interrupted during evaluation (here, caused by the failure of the throwing
-      // SkyFunction during a no-keep-going evaluation),
-      EvaluationResult<StringValue> unexpectedResult =
-          tester.eval(/*keepGoing=*/ false, badInterruptkey, failKey);
-      fail(unexpectedResult.toString());
-    } catch (RuntimeException e) {
-      // Then the Evaluator#evaluate call throws a RuntimeException e where e.getCause() is the
-      // RuntimeException thrown by that SkyFunction.
-      assertThat(e).hasCauseThat().hasMessageThat().isEqualTo("I don't like being woken up!");
-    }
+    // When it is interrupted during evaluation (here, caused by the failure of the throwing
+    // SkyFunction during a no-keep-going evaluation), then the Evaluator#evaluate call throws a
+    // RuntimeException e where e.getCause() is the
+    // RuntimeException thrown by that SkyFunction.
+    RuntimeException e =
+        assertThrows(
+            RuntimeException.class,
+            () -> tester.eval(/*keepGoing=*/ false, badInterruptkey, failKey));
+    assertThat(e).hasCauseThat().hasMessageThat().isEqualTo("I don't like being woken up!");
   }
 
   @Test
@@ -3020,17 +3014,15 @@
             }
           });
       tester.invalidate();
-      TestThread evalThread = new TestThread() {
-        @Override
-        public void runTest() {
-          try {
-            tester.eval(/*keepGoing=*/false, tops.toArray(new SkyKey[0]));
-            fail();
-          } catch (InterruptedException e) {
-            // Expected.
-          }
-        }
-      };
+      TestThread evalThread =
+          new TestThread() {
+            @Override
+            public void runTest() {
+              assertThrows(
+                  InterruptedException.class,
+                  () -> tester.eval(/*keepGoing=*/ false, tops.toArray(new SkyKey[0])));
+            }
+          };
       evalThread.start();
       assertThat(notifyStart.await(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS)).isTrue();
       evalThread.interrupt();
@@ -3078,13 +3070,7 @@
     manyDirtyValuesClearChildrenOnFail(/*interrupt=*/true);
   }
 
-  /**
-   * Regression test for case where the user requests that we delete nodes that are already in the
-   * queue to be dirtied. We should handle that gracefully and not complain.
-   */
-  @Test
-  public void deletingDirtyNodes() throws Exception {
-    SkyKey node0 = GraphTester.nonHermeticKey("node0");
+  private SkyKey makeTestKey(SkyKey node0) {
     SkyKey key = null;
     // Create a long chain of nodes. Most of them will not actually be dirtied, but the last one to
     // be dirtied will enqueue its parent for dirtying, so it will be in the queue for the next run.
@@ -3098,6 +3084,17 @@
         tester.set(key, new StringValue("node0"));
       }
     }
+    return key;
+  }
+
+  /**
+   * Regression test for case where the user requests that we delete nodes that are already in the
+   * queue to be dirtied. We should handle that gracefully and not complain.
+   */
+  @Test
+  public void deletingDirtyNodes() throws Exception {
+    SkyKey node0 = GraphTester.nonHermeticKey("node0");
+    SkyKey key = makeTestKey(node0);
     // Seed the graph.
     assertThat(((StringValue) tester.evalAndGet(/*keepGoing=*/ false, key)).getValue())
         .isEqualTo("node0");
@@ -3109,12 +3106,7 @@
     final Thread thread = Thread.currentThread();
     tester.progressReceiver.setNextInvalidationCallback(thread::interrupt);
 
-    try {
-      tester.eval(/*keepGoing=*/false, key);
-      fail();
-    } catch (InterruptedException e) {
-      // Expected.
-    }
+    assertThrows(InterruptedException.class, () -> tester.eval(/*keepGoing=*/ false, key));
 
     // Cleanup + paranoid check
     tester.progressReceiver.setNextInvalidationCallback(null);
@@ -3393,12 +3385,7 @@
     // Evaluator will think leaf was interrupted because it threw, so it will be cleaned from graph.
     tester.getOrCreate(value, /*markAsModified=*/true).setBuilder(INTERRUPT_BUILDER);
     tester.invalidate();
-    try {
-      tester.eval(/*keepGoing=*/false, value);
-      fail();
-    } catch (InterruptedException e) {
-      // Expected.
-    }
+    assertThrows(InterruptedException.class, () -> tester.eval(/*keepGoing=*/ false, value));
     tester.getOrCreate(value, /*markAsModified=*/false).setBuilder(null);
   }
 
@@ -3490,12 +3477,9 @@
     // Evaluator will think leaf was interrupted because it threw, so it will be cleaned from graph.
     tester.getOrCreate(leafKey, /*markAsModified=*/true).setBuilder(INTERRUPT_BUILDER);
     tester.invalidate();
-    try {
-      tester.eval(/*keepGoing=*/false, tops.toArray(new SkyKey[0]));
-      fail();
-    } catch (InterruptedException e) {
-      // Expected.
-    }
+    assertThrows(
+        InterruptedException.class,
+        () -> tester.eval(/*keepGoing=*/ false, tops.toArray(new SkyKey[0])));
   }
 
   @Test
@@ -4428,12 +4412,7 @@
 
     tester.differencer.inject(ImmutableMap.of(key, val));
     Thread.currentThread().interrupt();
-    try {
-      tester.evalAndGet(/*keepGoing=*/ false, key);
-      fail();
-    } catch (InterruptedException expected) {
-      // Expected.
-    }
+    assertThrows(InterruptedException.class, () -> tester.evalAndGet(/*keepGoing=*/ false, key));
     SkyValue newVal = tester.evalAndGet(/*keepGoing=*/ false, key);
     assertThat(newVal).isEqualTo(val);
   }
@@ -4988,13 +4967,7 @@
     // And so is top,
     tester.getOrCreate(topKey, /*markAsModified=*/ true);
     tester.invalidate();
-    try {
-      // Then evaluation is interrupted,
-      tester.eval(/*keepGoing=*/ false, topKey);
-      fail();
-    } catch (InterruptedException e) {
-      // Expected.
-    }
+    assertThrows(InterruptedException.class, () -> tester.eval(/*keepGoing=*/ false, topKey));
     // But inactive is still present,
     assertThat(tester.driver.getEntryForTesting(inactiveKey)).isNotNull();
     // And still dirty,
diff --git a/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java b/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
index b92b76c..73444e2 100644
--- a/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
@@ -17,6 +17,7 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 import static com.google.devtools.build.lib.testutil.EventIterableSubjectFactory.assertThatEvents;
+import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
 import static com.google.devtools.build.skyframe.EvaluationResultSubjectFactory.assertThatEvaluationResult;
 import static com.google.devtools.build.skyframe.GraphTester.CONCATENATE;
 import static org.junit.Assert.fail;
@@ -220,12 +221,9 @@
                   return null;
                 }
                 assertThat(future.isDone()).isTrue();
-                try {
-                  future.get();
-                  fail();
-                } catch (ExecutionException expected) {
-                  assertThat(expected.getCause()).isInstanceOf(UnsupportedOperationException.class);
-                }
+                ExecutionException expected =
+                    assertThrows(ExecutionException.class, () -> future.get());
+                assertThat(expected.getCause()).isInstanceOf(UnsupportedOperationException.class);
                 return new StringValue("Caught!");
               }
 
@@ -454,17 +452,13 @@
 
     // And we have a dedicated thread that kicks off the evaluation of A and B together (in that
     // order).
-    TestThread evalThread = new TestThread() {
-      @Override
-      public void runTest() throws Exception {
-        try {
-          eval(/*keepGoing=*/true, keyA, keyB);
-          fail();
-        } catch (InterruptedException e) {
-          // Expected.
-        }
-      }
-    };
+    TestThread evalThread =
+        new TestThread() {
+          @Override
+          public void runTest() throws Exception {
+            assertThrows(InterruptedException.class, () -> eval(/*keepGoing=*/ true, keyA, keyB));
+          }
+        };
 
     // Then when we start that thread,
     evalThread.start();
@@ -523,17 +517,14 @@
                 receivedValues.add(skyKey);
               }
             });
-    TestThread evalThread = new TestThread() {
-      @Override
-      public void runTest() throws Exception {
-        try {
-          eval(/*keepGoing=*/true, waitKey, fastKey);
-          fail();
-        } catch (InterruptedException e) {
-          // Expected.
-        }
-      }
-    };
+    TestThread evalThread =
+        new TestThread() {
+          @Override
+          public void runTest() throws Exception {
+            assertThrows(
+                InterruptedException.class, () -> eval(/*keepGoing=*/ true, waitKey, fastKey));
+          }
+        };
     evalThread.start();
     assertThat(allValuesReady.await(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS)).isTrue();
     evalThread.interrupt();
@@ -660,15 +651,12 @@
             new InMemoryGraphImpl(), ImmutableMap.of(GraphTester.NODE_TYPE, builder), false);
 
     SkyKey valueToEval = GraphTester.toSkyKey("a");
-    try {
-      evaluator.eval(ImmutableList.of(valueToEval));
-      fail("Expected RuntimeException");
-    } catch (RuntimeException re) {
-      assertThat(re)
-          .hasMessageThat()
-          .contains("Unrecoverable error while evaluating node '" + valueToEval.toString() + "'");
-      assertThat(re).hasCauseThat().isInstanceOf(CustomRuntimeException.class);
-    }
+    RuntimeException re =
+        assertThrows(RuntimeException.class, () -> evaluator.eval(ImmutableList.of(valueToEval)));
+    assertThat(re)
+        .hasMessageThat()
+        .contains("Unrecoverable error while evaluating node '" + valueToEval.toString() + "'");
+    assertThat(re).hasCauseThat().isInstanceOf(CustomRuntimeException.class);
   }
 
   @Test
@@ -1915,17 +1903,16 @@
             PARENT_TYPE, new ParentFunction());
     ParallelEvaluator evaluator = makeEvaluator(new InMemoryGraphImpl(), skyFunctions, false);
 
-    try {
-      evaluator.eval(ImmutableList.of(ParentKey.create("octodad")));
-      fail();
-    } catch (RuntimeException e) {
-      assertThat(e).hasCauseThat().hasMessageThat().isEqualTo("I WANT A PONY!!!");
-      assertThat(e)
-          .hasMessageThat()
-          .isEqualTo(
-              "Unrecoverable error while evaluating node 'child:billy the kid' "
-                  + "(requested by nodes 'parent:octodad')");
-    }
+    RuntimeException e =
+        assertThrows(
+            RuntimeException.class,
+            () -> evaluator.eval(ImmutableList.of(ParentKey.create("octodad"))));
+    assertThat(e).hasCauseThat().hasMessageThat().isEqualTo("I WANT A PONY!!!");
+    assertThat(e)
+        .hasMessageThat()
+        .isEqualTo(
+            "Unrecoverable error while evaluating node 'child:billy the kid' "
+                + "(requested by nodes 'parent:octodad')");
   }
 
   private static class SomeOtherErrorException extends Exception {
diff --git a/src/test/java/com/google/devtools/build/skyframe/ReverseDepsUtilityTest.java b/src/test/java/com/google/devtools/build/skyframe/ReverseDepsUtilityTest.java
index c846771..7d3ffd9 100644
--- a/src/test/java/com/google/devtools/build/skyframe/ReverseDepsUtilityTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/ReverseDepsUtilityTest.java
@@ -15,7 +15,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
-import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Interner;
@@ -107,11 +106,7 @@
     // Should only fail when we call getReverseDeps().
     ReverseDepsUtility.addReverseDeps(example, Collections.singleton(key));
     ReverseDepsUtility.removeReverseDep(example, key);
-    try {
-      ReverseDepsUtility.getReverseDeps(example);
-      fail();
-    } catch (IllegalStateException expected) {
-    }
+    assertThrows(IllegalStateException.class, () -> ReverseDepsUtility.getReverseDeps(example));
   }
 
   @Test
@@ -124,11 +119,8 @@
     ReverseDepsUtility.addReverseDeps(example, Collections.singleton(key));
     ReverseDepsUtility.removeReverseDep(example, key);
     ReverseDepsUtility.checkReverseDep(example, fixedKey);
-    try {
-      ReverseDepsUtility.checkReverseDep(example, fixedKey);
-      fail();
-    } catch (IllegalStateException expected) {
-    }
+    assertThrows(
+        IllegalStateException.class, () -> ReverseDepsUtility.checkReverseDep(example, fixedKey));
   }
 
   @Test
