diff --git a/src/test/java/com/google/devtools/build/android/UnwrittenMergedAndroidDataSubject.java b/src/test/java/com/google/devtools/build/android/UnwrittenMergedAndroidDataSubject.java
index ea871a3..532bc36 100644
--- a/src/test/java/com/google/devtools/build/android/UnwrittenMergedAndroidDataSubject.java
+++ b/src/test/java/com/google/devtools/build/android/UnwrittenMergedAndroidDataSubject.java
@@ -14,6 +14,7 @@
 package com.google.devtools.build.android;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import com.google.common.base.Objects;
 import com.google.common.truth.FailureMetadata;
@@ -38,8 +39,8 @@
         assertThat(subject).isEqualTo(expected);
       }
       if (subject.getManifest() != null) {
-        assertThat(subject.getManifest().toString())
-            .named("manifest")
+        assertWithMessage("manifest")
+            .that(subject.getManifest().toString())
             .isEqualTo(expected.getManifest().toString());
       }
 
@@ -50,14 +51,14 @@
 
   private void compareDataSets(
       String identifier, ParsedAndroidData subject, ParsedAndroidData expected) {
-    assertThat(subject.getOverwritingResources())
-        .named("Overwriting " + identifier)
+    assertWithMessage("Overwriting " + identifier)
+        .that(subject.getOverwritingResources())
         .containsExactlyEntriesIn(expected.getOverwritingResources());
-    assertThat(subject.getCombiningResources())
-        .named("Combining " + identifier)
+    assertWithMessage("Combining " + identifier)
+        .that(subject.getCombiningResources())
         .containsExactlyEntriesIn(expected.getCombiningResources());
-    assertThat(subject.getAssets())
-        .named("Assets " + identifier)
+    assertWithMessage("Assets " + identifier)
+        .that(subject.getAssets())
         .containsExactlyEntriesIn(expected.getAssets());
   }
 }
diff --git a/src/test/java/com/google/devtools/build/android/desugar/DesugarFunctionalTest.java b/src/test/java/com/google/devtools/build/android/desugar/DesugarFunctionalTest.java
index 5092961..32027a5 100644
--- a/src/test/java/com/google/devtools/build/android/desugar/DesugarFunctionalTest.java
+++ b/src/test/java/com/google/devtools/build/android/desugar/DesugarFunctionalTest.java
@@ -14,6 +14,7 @@
 package com.google.devtools.build.android.desugar;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static java.lang.reflect.Modifier.isFinal;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.fail;
@@ -188,11 +189,11 @@
     Method result = null;
     for (Method m : clazz.getDeclaredMethods()) {
       if (m.getName().startsWith("bridge$")) {
-        assertThat(result).named(m.getName()).isNull();
+        assertWithMessage(m.getName()).that(result).isNull();
         result = m;
       }
     }
-    assertThat(result).named(clazz.getSimpleName()).isNotNull();
+    assertWithMessage(clazz.getSimpleName()).that(result).isNotNull();
     return result;
   }
 
diff --git a/src/test/java/com/google/devtools/build/android/dexer/DexBuilderTest.java b/src/test/java/com/google/devtools/build/android/dexer/DexBuilderTest.java
index 3c3717d..4e50acd 100644
--- a/src/test/java/com/google/devtools/build/android/dexer/DexBuilderTest.java
+++ b/src/test/java/com/google/devtools/build/android/dexer/DexBuilderTest.java
@@ -14,6 +14,7 @@
 package com.google.devtools.build.android.dexer;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static java.nio.charset.StandardCharsets.UTF_8;
 
 import com.android.dex.Dex;
@@ -57,10 +58,10 @@
         files.add(entry.getName());
         if (entry.getName().endsWith(".dex")) {
           Dex dex = new Dex(zip.getInputStream(entry));
-          assertThat(dex.classDefs()).named(entry.getName()).hasSize(1);
+          assertWithMessage(entry.getName()).that(dex.classDefs()).hasSize(1);
         } else if (entry.getName().endsWith("/testresource.txt")) {
           byte[] content = ByteStreams.toByteArray(zip.getInputStream(entry));
-          assertThat(content).named(entry.getName()).isEqualTo("test".getBytes(UTF_8));
+          assertWithMessage(entry.getName()).that(content).isEqualTo("test".getBytes(UTF_8));
         }
       }
     }
diff --git a/src/test/java/com/google/devtools/build/android/dexer/DexFileMergerTest.java b/src/test/java/com/google/devtools/build/android/dexer/DexFileMergerTest.java
index 72aafeb..e435efb 100644
--- a/src/test/java/com/google/devtools/build/android/dexer/DexFileMergerTest.java
+++ b/src/test/java/com/google/devtools/build/android/dexer/DexFileMergerTest.java
@@ -14,6 +14,7 @@
 package com.google.devtools.build.android.dexer;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.fail;
 
@@ -302,9 +303,15 @@
       Set<String> shard = dexFiles.get(expectedDexFileName(i));
       for (String c1 : prev) {
         for (String c2 : shard) {
-          assertThat(ZipEntryComparator.compareClassNames(c2, c1))
-              .named(c2 + " in shard " + i + " should compare as larger than " + c1
-                  + "; list of all shards for reference: " + dexFiles)
+          assertWithMessage(
+                  c2
+                      + " in shard "
+                      + i
+                      + " should compare as larger than "
+                      + c1
+                      + "; list of all shards for reference: "
+                      + dexFiles)
+              .that(ZipEntryComparator.compareClassNames(c2, c1))
               .isGreaterThan(0);
         }
       }
diff --git a/src/test/java/com/google/devtools/build/android/dexer/DexFileSplitterTest.java b/src/test/java/com/google/devtools/build/android/dexer/DexFileSplitterTest.java
index 8390215..4da1a2d 100644
--- a/src/test/java/com/google/devtools/build/android/dexer/DexFileSplitterTest.java
+++ b/src/test/java/com/google/devtools/build/android/dexer/DexFileSplitterTest.java
@@ -14,6 +14,7 @@
 package com.google.devtools.build.android.dexer;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.fail;
 
@@ -133,9 +134,9 @@
       for (int i = 0; i < len; ++i) {
         ZipEntry expected = expectedEntries.get(i);
         ZipEntry actual = actualEntries.get(i);
-        assertThat(actual.getName()).named(actual.getName()).isEqualTo(expected.getName());
-        assertThat(actual.getSize()).named(actual.getName()).isEqualTo(expected.getSize());
-        assertThat(actual.getCrc()).named(actual.getName()).isEqualTo(expected.getCrc());
+        assertWithMessage(actual.getName()).that(actual.getName()).isEqualTo(expected.getName());
+        assertWithMessage(actual.getName()).that(actual.getSize()).isEqualTo(expected.getSize());
+        assertWithMessage(actual.getName()).that(actual.getCrc()).isEqualTo(expected.getCrc());
       }
     }
   }
diff --git a/src/test/java/com/google/devtools/build/android/ziputils/SplitZipTest.java b/src/test/java/com/google/devtools/build/android/ziputils/SplitZipTest.java
index 15f1461..8913126 100644
--- a/src/test/java/com/google/devtools/build/android/ziputils/SplitZipTest.java
+++ b/src/test/java/com/google/devtools/build/android/ziputils/SplitZipTest.java
@@ -301,10 +301,12 @@
         .add("pkg2/test3.class", "bye bye")
         .create("expected/shard2.jar");
 
-    assertThat(fileSystem.toByteArray("out/shard1.jar")).named("shard1")
+    assertWithMessage("shard1")
+        .that(fileSystem.toByteArray("out/shard1.jar"))
         .isEqualTo(fileSystem.toByteArray("expected/shard1.jar"));
 
-    assertThat(fileSystem.toByteArray("out/shard2.jar")).named("shard2")
+    assertWithMessage("shard2")
+        .that(fileSystem.toByteArray("out/shard2.jar"))
         .isEqualTo(fileSystem.toByteArray("expected/shard2.jar"));
   }
 
@@ -336,10 +338,12 @@
         .add("d.class", "good night")
         .create("expected/shard2.jar");
 
-    assertThat(fileSystem.toByteArray("out/shard1.jar")).named("shard1")
+    assertWithMessage("shard1")
+        .that(fileSystem.toByteArray("out/shard1.jar"))
         .isEqualTo(fileSystem.toByteArray("expected/shard1.jar"));
 
-    assertThat(fileSystem.toByteArray("out/shard2.jar")).named("shard2")
+    assertWithMessage("shard2")
+        .that(fileSystem.toByteArray("out/shard2.jar"))
         .isEqualTo(fileSystem.toByteArray("expected/shard2.jar"));
   }
 
diff --git a/src/test/java/com/google/devtools/build/android/ziputils/SplitterTest.java b/src/test/java/com/google/devtools/build/android/ziputils/SplitterTest.java
index 6deb0ea..3f24eda 100644
--- a/src/test/java/com/google/devtools/build/android/ziputils/SplitterTest.java
+++ b/src/test/java/com/google/devtools/build/android/ziputils/SplitterTest.java
@@ -14,19 +14,18 @@
 package com.google.devtools.build.android.ziputils;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import com.google.common.collect.Range;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Unit tests for {@link Splitter}.
@@ -63,9 +62,9 @@
       for (int j = 0; j < size; j++) {
         String path = "dir" + i + ARCHIVE_FILE_SEPARATOR + "file" + j + CLASS_SUFFIX;
         if (i == j) {
-          assertThat(output.get(path)).named(path).isEqualTo(0);
+          assertWithMessage(path).that(output.get(path)).isEqualTo(0);
         } else {
-          assertThat(output.get(path)).named(path).isEqualTo(i + 1);
+          assertWithMessage(path).that(output.get(path)).isEqualTo(i + 1);
         }
       }
     }
@@ -263,7 +262,7 @@
    */
   private void assertNoSplit(String name, int packageSize, int[] counts) {
     for (int i = 1; i < counts.length; i++) {
-      assertThat(counts[i]).named(name + " shard " + i).isAtLeast(0);
+      assertWithMessage(name + " shard " + i).that(counts[i]).isAtLeast(0);
     }
   }
 
@@ -275,7 +274,7 @@
       if (counts[i + 1] <= 1) {
         continue;
       }
-      assertThat(counts[i]).named(name + " shard " + i).isAtMost(packageSize);
+      assertWithMessage(name + " shard " + i).that(counts[i]).isAtMost(packageSize);
     }
   }
 
@@ -291,7 +290,7 @@
         assertThat(!hasEmpty || counts[i] == 0).isTrue();
       }
     }
-    assertThat(hasEmpty).named(name).isEqualTo(expectEmpty);
+    assertWithMessage(name).that(hasEmpty).isEqualTo(expectEmpty);
   }
 
   /**
@@ -311,22 +310,25 @@
       if (i < shards && counts[i + 1] > 1) {
         if (shards <= packageCount) {
           // if there are fewer shards than packages, expect shards contain at least 1 full package
-          assertThat(counts[i]).named(name + " dense shard " + i)
+          assertWithMessage(name + " dense shard " + i)
+              .that(counts[i])
               .isIn(Range.closed(packageSize, entries));
         } else {
-          assertThat(counts[i]).named(name + " sparse shard " + i)
+          assertWithMessage(name + " sparse shard " + i)
+              .that(counts[i])
               .isIn(Range.closed(0, packageSize));
         }
         if (noneClass == 0 && counts[0] == 0) {
           // Give some slack in minimal number of entries in a shard because Splitter recomputes
           // boundaries for each shard, so our computed bounds can be off for later shards.
-          assertThat(counts[i]).named(name + " shard " + i)
+          assertWithMessage(name + " shard " + i)
+              .that(counts[i])
               .isIn(Range.closed(lowerBound - i, entries));
         }
       }
       // Give some slack in maximum number of entries in a shard because Splitter recomputes
       // boundaries for each shard, so our computed bounds can be off for later shards.
-      assertThat(adjusted).named(name + " shard " + i).isAtMost(upperBound + i);
+      assertWithMessage(name + " shard " + i).that(adjusted).isAtMost(upperBound + i);
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index 9df4bda..6754c6d 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -1268,8 +1268,8 @@
         result.add(output);
       }
     }
-    assertThat(expectedPaths)
-        .named("expected paths not found in: %s", Artifact.asExecPaths(owner.getInputs()))
+    assertWithMessage("expected paths not found in: %s", Artifact.asExecPaths(owner.getInputs()))
+        .that(expectedPaths)
         .isEmpty();
     return result;
   }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
index 2f988cc..e609777 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
@@ -369,8 +369,8 @@
         // If that's desired then we'll need to make sure dependency checking is done in another
         // action that APK artifacts depend on, in addition to the check that happens when building
         // deploy.jars, which we assert above.
-        assertThat(actionsTestUtil().artifactClosureOf(built))
-            .named("%s dependency on deploy.jar", built.getFilename())
+        assertWithMessage("%s dependency on deploy.jar", built.getFilename())
+            .that(actionsTestUtil().artifactClosureOf(built))
             .contains(singlejar.getPrimaryOutput());
         ++found;
       }
@@ -596,8 +596,9 @@
     for (Artifact input : getNonToolInputs(shardAction)) {
       String basename = input.getFilename();
       // all jars are converted to dex archives
-      assertThat(!basename.contains(".jar") || basename.endsWith(".jar.dex.zip"))
-          .named(basename).isTrue();
+      assertWithMessage(basename)
+          .that(!basename.contains(".jar") || basename.endsWith(".jar.dex.zip"))
+          .isTrue();
       // all jars are desugared before being converted
       if (basename.endsWith(".jar.dex.zip")) {
         assertThat(getGeneratingAction(input).getPrimaryInput().getFilename())
@@ -2935,7 +2936,7 @@
 
     ConfiguredTarget top = getConfiguredTarget("//java/com/google/android:foo");
     Artifact artifact = getBinArtifact("_dx/foo/_final_classes.dex.zip", top);
-    assertThat(artifact).named("_final_classes.dex.zip").isNotNull();
+    assertWithMessage("_final_classes.dex.zip").that(artifact).isNotNull();
     Action generatingAction = getGeneratingAction(artifact);
     assertThat(ActionsTestUtil.baseArtifactNames(generatingAction.getInputs()))
         .containsAtLeast("classes.dex.zip", /*canned*/ "java8_legacy.dex.zip");
@@ -2956,7 +2957,7 @@
 
     ConfiguredTarget top = getConfiguredTarget("//java/com/google/android:foo");
     Artifact artifact = getBinArtifact("_dx/foo/_final_classes.dex.zip", top);
-    assertThat(artifact).named("_final_classes.dex.zip").isNotNull();
+    assertWithMessage("_final_classes.dex.zip").that(artifact).isNotNull();
     Action generatingAction = getGeneratingAction(artifact);
     assertThat(ActionsTestUtil.baseArtifactNames(generatingAction.getInputs()))
         .containsAtLeast("classes.dex.zip", /*built*/ "_java8_legacy.dex.zip");
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java
index e64d9e9..6319afe 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java
@@ -136,7 +136,7 @@
       ConfiguredTarget target, boolean transitive) {
     Preconditions.checkNotNull(target);
     final AndroidResourcesInfo info = target.get(AndroidResourcesInfo.PROVIDER);
-    assertThat(info).named("No android resources exported from the target.").isNotNull();
+    assertWithMessage("No android resources exported from the target.").that(info).isNotNull();
     return getOnlyElement(
         transitive ? info.getTransitiveAndroidResources() : info.getDirectAndroidResources());
   }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingTest.java
index 416d726..d678bb0 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingTest.java
@@ -14,6 +14,7 @@
 package com.google.devtools.build.lib.rules.android;
 
 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.getFirstArtifactEndingWith;
 import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.prettyArtifactNames;
 import static com.google.devtools.build.lib.rules.java.JavaCompileActionTestHelper.getJavacArguments;
@@ -353,9 +354,7 @@
     ConfiguredTarget a = getConfiguredTarget("//java/a:a");
     final UsesDataBindingProvider usesDataBindingProvider = a.get(UsesDataBindingProvider.PROVIDER);
 
-    Truth.assertThat(usesDataBindingProvider)
-        .named(UsesDataBindingProvider.NAME)
-        .isNotNull();
+    assertWithMessage(UsesDataBindingProvider.NAME).that(usesDataBindingProvider).isNotNull();
 
     Truth.assertThat(
             usesDataBindingProvider
@@ -408,8 +407,8 @@
         ")");
     useConfiguration("--android_sdk=//sdk:sdk");
     ConfiguredTarget b = getConfiguredTarget("//java/b:b");
-    Truth.assertThat(b.get(UsesDataBindingProvider.PROVIDER))
-        .named("UsesDataBindingProvider")
+    assertWithMessage("UsesDataBindingProvider")
+        .that(b.get(UsesDataBindingProvider.PROVIDER))
         .isNotNull();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingV2Test.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingV2Test.java
index 94124f6..f28e684 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingV2Test.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingV2Test.java
@@ -14,13 +14,13 @@
 package com.google.devtools.build.lib.rules.android;
 
 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.getFirstArtifactEndingWith;
 import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.prettyArtifactNames;
 import static com.google.devtools.build.lib.rules.java.JavaCompileActionTestHelper.getJavacArguments;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
-import com.google.common.truth.Truth;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.extra.JavaCompileInfo;
 import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
@@ -448,9 +448,7 @@
     ConfiguredTarget a = getConfiguredTarget("//java/a:a");
     final DataBindingV2Provider dataBindingV2Provider = a.get(DataBindingV2Provider.PROVIDER);
 
-    assertThat(dataBindingV2Provider)
-        .named(DataBindingV2Provider.NAME)
-        .isNotNull();
+    assertWithMessage(DataBindingV2Provider.NAME).that(dataBindingV2Provider).isNotNull();
 
     assertThat(
         dataBindingV2Provider
@@ -520,9 +518,7 @@
         ")");
 
     ConfiguredTarget b = getConfiguredTarget("//java/b:b");
-    Truth.assertThat(b.get(DataBindingV2Provider.PROVIDER))
-        .named("DataBindingV2Info")
-        .isNotNull();
+    assertWithMessage("DataBindingV2Info").that(b.get(DataBindingV2Provider.PROVIDER)).isNotNull();
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
index 66b5ef0..c7119a6 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
@@ -15,6 +15,7 @@
 
 import static com.google.common.collect.Iterables.getOnlyElement;
 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.baseArtifactNames;
 import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.baseNamesOf;
 import static org.junit.Assume.assumeTrue;
@@ -331,7 +332,7 @@
         ActionsTestUtil.baseArtifactNames(getOutputGroup(target, OutputGroupInfo.TEMP_FILES));
 
     // Return the IterableSubject for the temp files.
-    return assertThat(temps).named("k8");
+    return assertWithMessage("k8").that(temps);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkstampCompileHelperTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkstampCompileHelperTest.java
index 8dc30fb..051c118 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkstampCompileHelperTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkstampCompileHelperTest.java
@@ -15,6 +15,7 @@
 package com.google.devtools.build.lib.rules.cpp;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
@@ -87,12 +88,12 @@
     assertThat(arguments).contains("-DGPLATFORM=\"" + platform + "\"");
     assertThat(arguments).contains("-I.");
     String correctG3BuildTargetPattern = "-DG3_BUILD_TARGET=\".*" + buildTargetNameSuffix + "\"";
-    assertThat(Iterables.tryFind(arguments, (arg) -> arg.matches(correctG3BuildTargetPattern)))
-        .named("in " + arguments + " flag matching " + correctG3BuildTargetPattern)
+    assertWithMessage("in " + arguments + " flag matching " + correctG3BuildTargetPattern)
+        .that(Iterables.tryFind(arguments, (arg) -> arg.matches(correctG3BuildTargetPattern)))
         .isPresent();
     String fdoStampPattern = "-D" + CppConfiguration.FDO_STAMP_MACRO + "=\".*\"";
-    assertThat(Iterables.tryFind(arguments, (arg) -> arg.matches(fdoStampPattern)))
-        .named("in " + arguments + " flag matching " + fdoStampPattern)
+    assertWithMessage("in " + arguments + " flag matching " + fdoStampPattern)
+        .that(Iterables.tryFind(arguments, (arg) -> arg.matches(fdoStampPattern)))
         .isAbsent();
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
index d70cd05..04314d5 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
@@ -14,6 +14,7 @@
 package com.google.devtools.build.lib.rules.java;
 
 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.prettyArtifactNames;
 
 import com.google.common.collect.ImmutableMap;
@@ -2014,11 +2015,11 @@
                 ((ConfiguredTarget) info.getValue("java_toolchain_label"))
                     .get(ToolchainInfo.PROVIDER))
             .getToolchainLabel();
-    assertThat(
+    assertWithMessage(javaToolchainLabel.toString())
+        .that(
             javaToolchainLabel.toString().endsWith("jdk:remote_toolchain")
                 || javaToolchainLabel.toString().endsWith("jdk:toolchain")
                 || javaToolchainLabel.toString().endsWith("jdk:toolchain_host"))
-        .named(javaToolchainLabel.toString())
         .isTrue();
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
index 16636ad..15bbe94 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
@@ -1103,16 +1103,18 @@
     LoadStatement stmt = (LoadStatement) statements.get(0);
     SkylarkImport imp = SkylarkImport.create(stmt.getImport().getValue());
 
-    assertThat(imp.getImportString()).named("getImportString()").isEqualTo(importString);
+    assertWithMessage("getImportString()").that(imp.getImportString()).isEqualTo(importString);
 
     Label containingFileLabel = Label.parseAbsoluteUnchecked(containingFileLabelString);
-    assertThat(imp.getLabel(containingFileLabel)).named("containingFileLabel()")
+    assertWithMessage("containingFileLabel()")
+        .that(imp.getLabel(containingFileLabel))
         .isEqualTo(Label.parseAbsoluteUnchecked(expectedLabelString));
 
     int startOffset = stmt.getImport().getLocation().getStartOffset();
     int endOffset = stmt.getImport().getLocation().getEndOffset();
-    assertThat(startOffset).named("getStartOffset()").isEqualTo(5);
-    assertThat(endOffset).named("getEndOffset()")
+    assertWithMessage("getStartOffset()").that(startOffset).isEqualTo(5);
+    assertWithMessage("getEndOffset()")
+        .that(endOffset)
         .isEqualTo(startOffset + importString.length() + 2);
   }
 
@@ -1229,8 +1231,8 @@
     Identifier sym = stmt.getBindings().get(0).getLocalName();
     int startOffset = sym.getLocation().getStartOffset();
     int endOffset = sym.getLocation().getEndOffset();
-    assertThat(startOffset).named("getStartOffset()").isEqualTo(27);
-    assertThat(endOffset).named("getEndOffset()").isEqualTo(startOffset + 10);
+    assertWithMessage("getStartOffset()").that(startOffset).isEqualTo(27);
+    assertWithMessage("getEndOffset()").that(endOffset).isEqualTo(startOffset + 10);
   }
 
   @Test
@@ -1289,8 +1291,8 @@
     assertThat(sym.getName()).isEqualTo("my_alias");
     int startOffset = sym.getLocation().getStartOffset();
     int endOffset = sym.getLocation().getEndOffset();
-    assertThat(startOffset).named("getStartOffset()").isEqualTo(27);
-    assertThat(endOffset).named("getEndOffset()").isEqualTo(startOffset + 8);
+    assertWithMessage("getStartOffset()").that(startOffset).isEqualTo(27);
+    assertWithMessage("getEndOffset()").that(endOffset).isEqualTo(startOffset + 8);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkImportsTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkImportsTest.java
index b359bf6..55cd54d 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkImportsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkImportsTest.java
@@ -13,7 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.syntax;
 
-import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.hamcrest.CoreMatchers.startsWith;
 
 import com.google.common.collect.ImmutableMap;
@@ -39,10 +39,13 @@
       throws Exception {
     SkylarkImport importForLabel = SkylarkImport.create(labelString);
 
-    assertThat(importForLabel.getImportString()).named("getImportString()").isEqualTo(labelString);
+    assertWithMessage("getImportString()")
+        .that(importForLabel.getImportString())
+        .isEqualTo(labelString);
 
     Label irrelevantContainingFile = Label.parseAbsoluteUnchecked("//another/path:BUILD");
-    assertThat(importForLabel.getLabel(irrelevantContainingFile)).named("getLabel()")
+    assertWithMessage("getLabel()")
+        .that(importForLabel.getLabel(irrelevantContainingFile))
         .isEqualTo(Label.parseAbsoluteUnchecked(expectedLabelString));
   }
 
@@ -65,11 +68,13 @@
         ImmutableMap.of(RepositoryName.create("@orig_repo"), RepositoryName.create("@new_repo"));
     SkylarkImport importForLabel = SkylarkImport.create(labelString, repositoryMapping);
 
-    assertThat(importForLabel.getImportString()).named("getImportString()").isEqualTo(labelString);
+    assertWithMessage("getImportString()")
+        .that(importForLabel.getImportString())
+        .isEqualTo(labelString);
 
     Label irrelevantContainingFile = Label.parseAbsoluteUnchecked("//another/path:BUILD");
-    assertThat(importForLabel.getLabel(irrelevantContainingFile))
-        .named("getLabel()")
+    assertWithMessage("getLabel()")
+        .that(importForLabel.getLabel(irrelevantContainingFile))
         .isEqualTo(Label.parseAbsoluteUnchecked(remappedLabelString));
   }
 
@@ -78,12 +83,14 @@
       throws Exception {
     SkylarkImport importForLabel = SkylarkImport.create(labelString);
 
-    assertThat(importForLabel.getImportString()).named("getImportString()").isEqualTo(labelString);
+    assertWithMessage("getImportString()")
+        .that(importForLabel.getImportString())
+        .isEqualTo(labelString);
 
     // The import label is relative to the parent's package, not the parent's directory.
     Label containingLabel = Label.parseAbsolute(containingLabelString, ImmutableMap.of());
-    assertThat(importForLabel.getLabel(containingLabel))
-        .named("getLabel()")
+    assertWithMessage("getLabel()")
+        .that(importForLabel.getLabel(containingLabel))
         .isEqualTo(Label.parseAbsolute(expectedLabelString, ImmutableMap.of()));
   }
 
