Migrated tests in devtools/build/lib/skyframe to JUnit 4.

--
MOS_MIGRATED_REVID=109286530
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ActionDataTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ActionDataTest.java
index be903de..74c987a 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ActionDataTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ActionDataTest.java
@@ -13,6 +13,9 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skyframe;
 
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Sets;
 import com.google.devtools.build.lib.actions.AbstractAction;
@@ -28,6 +31,10 @@
 import com.google.devtools.build.lib.actions.util.DummyExecutor;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.io.IOException;
 import java.util.Collection;
 import java.util.Set;
@@ -36,8 +43,10 @@
  * Tests that the data passed from the application to the Builder is passed
  * down to each Action executed.
  */
+@RunWith(JUnit4.class)
 public class ActionDataTest extends TimestampBuilderTestCase {
 
+  @Test
   public void testArgumentToBuildArtifactsIsPassedDownToAction() throws Exception {
 
     class MyAction extends AbstractAction {
@@ -156,6 +165,7 @@
     }
   }
 
+  @Test
   public void testActionSharabilityAndDiscoveredInputs() throws Exception {
     Artifact output =
         new Artifact(
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java
index f808432..e054642 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java
@@ -12,7 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 package com.google.devtools.build.lib.skyframe;
-
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.lib.skyframe.FileArtifactValue.create;
 import static org.junit.Assert.assertArrayEquals;
@@ -89,8 +88,7 @@
   private TimestampGranularityMonitor tsgm = new TimestampGranularityMonitor(BlazeClock.instance());
 
   @Before
-  public void setUp() throws Exception {
-    
+  public final void setUp() throws Exception  {
     setupRoot(new CustomInMemoryFs());
     AtomicReference<PathPackageLocator> pkgLocator =
         new AtomicReference<>(PathPackageLocator.EMPTY);
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
index 72a47a5..45d6996 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
@@ -13,13 +13,17 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skyframe;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.testing.EqualsTester;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.events.NullEventHandler;
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
-import com.google.devtools.build.lib.testutil.FoundationTestCase;
+import com.google.devtools.build.lib.testutil.FoundationTestCaseForJunit4;
 import com.google.devtools.build.lib.util.BlazeClock;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -31,6 +35,11 @@
 import com.google.devtools.build.skyframe.SkyFunctionName;
 import com.google.devtools.build.skyframe.SkyKey;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
@@ -39,15 +48,15 @@
 /**
  * Tests for {@link ContainingPackageLookupFunction}.
  */
-public class ContainingPackageLookupFunctionTest extends FoundationTestCase {
+@RunWith(JUnit4.class)
+public class ContainingPackageLookupFunctionTest extends FoundationTestCaseForJunit4 {
 
   private AtomicReference<ImmutableSet<PackageIdentifier>> deletedPackages;
   private MemoizingEvaluator evaluator;
   private SequentialBuildDriver driver;
 
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
+  @Before
+  public final void setUp() throws Exception  {
     AtomicReference<PathPackageLocator> pkgLocator =
         new AtomicReference<>(new PathPackageLocator(outputBase, ImmutableList.of(rootDirectory)));
     deletedPackages = new AtomicReference<>(ImmutableSet.<PackageIdentifier>of());
@@ -83,11 +92,13 @@
         .get(key);
   }
 
+  @Test
   public void testNoContainingPackage() throws Exception {
     ContainingPackageLookupValue value = lookupContainingPackage("a/b");
     assertFalse(value.hasContainingPackage());
   }
 
+  @Test
   public void testContainingPackageIsParent() throws Exception {
     scratch.file("a/BUILD");
     ContainingPackageLookupValue value = lookupContainingPackage("a/b");
@@ -96,6 +107,7 @@
     assertEquals(rootDirectory, value.getContainingPackageRoot());
   }
 
+  @Test
   public void testContainingPackageIsSelf() throws Exception {
     scratch.file("a/b/BUILD");
     ContainingPackageLookupValue value = lookupContainingPackage("a/b");
@@ -104,6 +116,7 @@
     assertEquals(rootDirectory, value.getContainingPackageRoot());
   }
 
+  @Test
   public void testEqualsAndHashCodeContract() throws Exception {
     ContainingPackageLookupValue valueA1 = ContainingPackageLookupValue.NONE;
     ContainingPackageLookupValue valueA2 = ContainingPackageLookupValue.NONE;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/DiffAwarenessManagerTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/DiffAwarenessManagerTest.java
index 1ade3d4..90d53fb 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/DiffAwarenessManagerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/DiffAwarenessManagerTest.java
@@ -51,10 +51,13 @@
   protected EventCollectionApparatus events;
 
   @Before
-  public void setUp() throws Exception {
-    
+  public final void createFileSystem() throws Exception  {
     fs = new InMemoryFileSystem();
     root = fs.getRootDirectory();
+  }
+
+  @Before
+  public final void initializeEventCollectionApparatus() {
     events = new EventCollectionApparatus();
     events.setFailFast(false);
   }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
index deb2b9e..ae5de27 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
@@ -12,7 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 package com.google.devtools.build.lib.skyframe;
-
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.lib.skyframe.SkyframeExecutor.DEFAULT_THREAD_COUNT;
 import static org.junit.Assert.assertArrayEquals;
@@ -96,8 +95,7 @@
   private RecordingDifferencer differencer;
 
   @Before
-  public void setUp() throws Exception {
-
+  public final void createMonitor() throws Exception  {
     fastMd5 = true;
     manualClock = new ManualClock();
     createFsAndRoot(new CustomInMemoryFs(manualClock));
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java
index 40405fe..abb006c 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java
@@ -36,7 +36,7 @@
 import com.google.devtools.build.lib.events.NullEventHandler;
 import com.google.devtools.build.lib.packages.FilesetEntry.SymlinkBehavior;
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
-import com.google.devtools.build.lib.testutil.FoundationTestCase;
+import com.google.devtools.build.lib.testutil.FoundationTestCaseForJunit4;
 import com.google.devtools.build.lib.util.BlazeClock;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
@@ -53,6 +53,11 @@
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
@@ -65,7 +70,8 @@
 import javax.annotation.Nullable;
 
 /** Tests for {@link FilesetEntryFunction}. */
-public final class FilesetEntryFunctionTest extends FoundationTestCase {
+@RunWith(JUnit4.class)
+public final class FilesetEntryFunctionTest extends FoundationTestCaseForJunit4 {
 
   private TimestampGranularityMonitor tsgm = new TimestampGranularityMonitor(BlazeClock.instance());
   private MemoizingEvaluator evaluator;
@@ -73,10 +79,8 @@
   private RecordingDifferencer differencer;
   private AtomicReference<PathPackageLocator> pkgLocator;
 
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
-
+  @Before
+  public final void setUp() throws Exception  {
     pkgLocator = new AtomicReference<>(
         new PathPackageLocator(outputBase, ImmutableList.of(rootDirectory)));
     AtomicReference<ImmutableSet<PackageIdentifier>> deletedPackages =
@@ -195,6 +199,7 @@
     return Label.parseAbsolute(label);
   }
 
+  @Test
   public void testFileTraversalForFile() throws Exception {
     Artifact file = createSourceArtifact("foo/file.real");
     FilesetTraversalParams params =
@@ -231,14 +236,17 @@
     }
   }
 
+  @Test
   public void testFileTraversalForFileSymlinkNoFollow() throws Exception {
     assertFileTraversalForFileSymlink(SymlinkBehavior.COPY);
   }
 
+  @Test
   public void testFileTraversalForFileSymlinkFollow() throws Exception {
     assertFileTraversalForFileSymlink(SymlinkBehavior.DEREFERENCE);
   }
 
+  @Test
   public void testFileTraversalForDirectory() throws Exception {
     Artifact dir = getSourceArtifact("foo/dir_real");
     RootedPath fileA = createFile(childOf(dir, "file.a"), "hello");
@@ -281,10 +289,12 @@
     }
   }
 
+  @Test
   public void testFileTraversalForDirectorySymlinkFollow() throws Exception {
     assertFileTraversalForDirectorySymlink(SymlinkBehavior.COPY);
   }
 
+  @Test
   public void testFileTraversalForDirectorySymlinkNoFollow() throws Exception {
     assertFileTraversalForDirectorySymlink(SymlinkBehavior.DEREFERENCE);
   }
@@ -341,26 +351,32 @@
     }
   }
 
+  @Test
   public void testRecursiveTraversalForDirectoryCrossNoFollow() throws Exception {
     assertRecursiveTraversalForDirectory(SymlinkBehavior.COPY, CROSS);
   }
 
+  @Test
   public void testRecursiveTraversalForDirectoryDontCrossNoFollow() throws Exception {
     assertRecursiveTraversalForDirectory(SymlinkBehavior.COPY, DONT_CROSS);
   }
 
+  @Test
   public void testRecursiveTraversalForDirectoryReportErrorNoFollow() throws Exception {
     assertRecursiveTraversalForDirectory(SymlinkBehavior.COPY, REPORT_ERROR);
   }
 
+  @Test
   public void testRecursiveTraversalForDirectoryCrossFollow() throws Exception {
     assertRecursiveTraversalForDirectory(SymlinkBehavior.DEREFERENCE, CROSS);
   }
 
+  @Test
   public void testRecursiveTraversalForDirectoryDontCrossFollow() throws Exception {
     assertRecursiveTraversalForDirectory(SymlinkBehavior.DEREFERENCE, DONT_CROSS);
   }
 
+  @Test
   public void testRecursiveTraversalForDirectoryReportErrorFollow() throws Exception {
     assertRecursiveTraversalForDirectory(SymlinkBehavior.DEREFERENCE, REPORT_ERROR);
   }
@@ -422,26 +438,32 @@
     }
   }
 
+  @Test
   public void testRecursiveTraversalForDirectorySymlinkNoFollowCross() throws Exception {
     assertRecursiveTraversalForDirectorySymlink(SymlinkBehavior.COPY, CROSS);
   }
 
+  @Test
   public void testRecursiveTraversalForDirectorySymlinkNoFollowDontCross() throws Exception {
     assertRecursiveTraversalForDirectorySymlink(SymlinkBehavior.COPY, DONT_CROSS);
   }
 
+  @Test
   public void testRecursiveTraversalForDirectorySymlinkNoFollowReportError() throws Exception {
     assertRecursiveTraversalForDirectorySymlink(SymlinkBehavior.COPY, REPORT_ERROR);
   }
 
+  @Test
   public void testRecursiveTraversalForDirectorySymlinkFollowCross() throws Exception {
     assertRecursiveTraversalForDirectorySymlink(SymlinkBehavior.DEREFERENCE, CROSS);
   }
 
+  @Test
   public void testRecursiveTraversalForDirectorySymlinkFollowDontCross() throws Exception {
     assertRecursiveTraversalForDirectorySymlink(SymlinkBehavior.DEREFERENCE, DONT_CROSS);
   }
 
+  @Test
   public void testRecursiveTraversalForDirectorySymlinkFollowReportError() throws Exception {
     assertRecursiveTraversalForDirectorySymlink(SymlinkBehavior.DEREFERENCE, REPORT_ERROR);
   }
@@ -507,30 +529,37 @@
     }
   }
 
+  @Test
   public void testRecursiveTraversalForPackageNoFollowCross() throws Exception {
     assertRecursiveTraversalForPackage(SymlinkBehavior.COPY, CROSS);
   }
 
+  @Test
   public void testRecursiveTraversalForPackageNoFollowDontCross() throws Exception {
     assertRecursiveTraversalForPackage(SymlinkBehavior.COPY, DONT_CROSS);
   }
 
+  @Test
   public void testRecursiveTraversalForPackageNoFollowReportError() throws Exception {
     assertRecursiveTraversalForPackage(SymlinkBehavior.COPY, REPORT_ERROR);
   }
 
+  @Test
   public void testRecursiveTraversalForPackageFollowCross() throws Exception {
     assertRecursiveTraversalForPackage(SymlinkBehavior.DEREFERENCE, CROSS);
   }
 
+  @Test
   public void testRecursiveTraversalForPackageFollowDontCross() throws Exception {
     assertRecursiveTraversalForPackage(SymlinkBehavior.DEREFERENCE, DONT_CROSS);
   }
 
+  @Test
   public void testRecursiveTraversalForPackageFollowReportError() throws Exception {
     assertRecursiveTraversalForPackage(SymlinkBehavior.DEREFERENCE, REPORT_ERROR);
   }
 
+  @Test
   public void testNestedFileFilesetTraversal() throws Exception {
     Artifact path = getSourceArtifact("foo/bar.file");
     createFile(path, "blah");
@@ -587,14 +616,17 @@
     }
   }
 
+  @Test
   public void testNestedRecursiveFilesetTraversalWithInnerDestDir() throws Exception {
     assertNestedRecursiveFilesetTraversal(true);
   }
 
+  @Test
   public void testNestedRecursiveFilesetTraversalWithoutInnerDestDir() throws Exception {
     assertNestedRecursiveFilesetTraversal(false);
   }
 
+  @Test
   public void testFileTraversalForDanglingSymlink() throws Exception {
     Artifact linkName = getSourceArtifact("foo/dangling.sym");
     RootedPath linkTarget = createFile(siblingOf(linkName, "target.file"), "blah");
@@ -630,14 +662,17 @@
     assertSymlinksInOrder(paramsWithSymlinkCopy, symlink("output-name/BUILD", buildFile));
   }
 
+  @Test
   public void testExclusionOfDanglingSymlinkWithSymlinkModeCopy() throws Exception {
     assertExclusionOfDanglingSymlink(SymlinkBehavior.COPY);
   }
 
+  @Test
   public void testExclusionOfDanglingSymlinkWithSymlinkModeDereference() throws Exception {
     assertExclusionOfDanglingSymlink(SymlinkBehavior.DEREFERENCE);
   }
 
+  @Test
   public void testFileTraversalForNonExistentFile() throws Exception {
     Artifact path = getSourceArtifact("foo/non-existent");
     FilesetTraversalParams params =
@@ -650,6 +685,7 @@
     assertSymlinksInOrder(params); // expect empty results
   }
 
+  @Test
   public void testRecursiveTraversalForDanglingSymlink() throws Exception {
     Artifact linkName = getSourceArtifact("foo/dangling.sym");
     RootedPath linkTarget = createFile(siblingOf(linkName, "target.file"), "blah");
@@ -667,6 +703,7 @@
     assertSymlinksInOrder(params); // expect empty results
   }
 
+  @Test
   public void testRecursiveTraversalForNonExistentFile() throws Exception {
     Artifact path = getSourceArtifact("foo/non-existent");
 
@@ -770,6 +807,7 @@
     return new Domain(false, valueA, valueB);
   }
 
+  @Test
   public void testFingerprintOfFileTraversal() throws Exception {
     new FingerprintTester(
         ImmutableMap.<String, Domain>of(
@@ -791,6 +829,7 @@
     }.doTest();
   }
 
+  @Test
   public void testFingerprintOfDirectoryTraversal() throws Exception {
     new FingerprintTester(
         ImmutableMap.<String, Domain>builder()
@@ -819,6 +858,7 @@
     }.doTest();
   }
 
+  @Test
   public void testFingerprintOfPackageTraversal() throws Exception {
     new FingerprintTester(
         ImmutableMap.<String, Domain>builder()
@@ -847,6 +887,7 @@
     }.doTest();
   }
 
+  @Test
   public void testFingerprintOfNestedTraversal() throws Exception {
     FilesetTraversalParams n1 =
         FilesetTraversalParamsFactory.fileTraversal(
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
index d1d2018..69a267b 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
@@ -86,7 +86,7 @@
   private TimestampGranularityMonitor tsgm;
 
   @Before
-  public void setUp() throws Exception {
+  public final void setUp() throws Exception  {
     ImmutableMap.Builder<SkyFunctionName, SkyFunction> skyFunctions = ImmutableMap.builder();
 
     fs = new MockFileSystem();
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
index a03a107..a5c9614 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
@@ -99,8 +99,7 @@
   private static final PackageIdentifier PKG_PATH_ID = PackageIdentifier.createInDefaultRepo("pkg");
 
   @Before
-  public void setUp() throws Exception {
-    
+  public final void setUp() throws Exception  {
     fs = new CustomInMemoryFs(new ManualClock());
     root = fs.getRootDirectory().getRelative("root/workspace");
     writableRoot = fs.getRootDirectory().getRelative("writableRoot/workspace");
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
index 8fe6c9d..ec3ed24 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
@@ -15,13 +15,17 @@
 package com.google.devtools.build.lib.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
-import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.analysis.util.BuildViewTestCaseForJunit4;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.packages.ConstantRuleVisibility;
@@ -45,6 +49,10 @@
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.io.IOException;
 import java.util.Collection;
 import java.util.Map;
@@ -57,7 +65,8 @@
  * Unit tests of specific functionality of PackageFunction. Note that it's already tested
  * indirectly in several other places.
  */
-public class PackageFunctionTest extends BuildViewTestCase {
+@RunWith(JUnit4.class)
+public class PackageFunctionTest extends BuildViewTestCaseForJunit4 {
 
   private CustomInMemoryFs fs = new CustomInMemoryFs(new ManualClock());
 
@@ -82,6 +91,7 @@
     return value;
   }
 
+  @Test
   public void testInconsistentNewPackage() throws Exception {
     scratch.file("pkg/BUILD", "subinclude('//foo:sub')");
     scratch.file("foo/sub");
@@ -108,6 +118,7 @@
     assertThat(exception.getMessage()).contains("Unexpected package");
   }
 
+  @Test
   public void testInconsistentMissingPackage() throws Exception {
     reporter.removeHandler(failFastHandler);
     Path root1 = fs.getPath("/root1");
@@ -142,6 +153,7 @@
     assertThat(exception.getMessage()).contains("Inconsistent package location");
   }
 
+  @Test
   public void testPropagatesFilesystemInconsistencies() throws Exception {
     reporter.removeHandler(failFastHandler);
     RecordingDifferencer differencer = getSkyframeExecutor().getDifferencerForTesting();
@@ -208,6 +220,7 @@
     assertThat(errorMessage).contains(expectedMessage);
   }
 
+  @Test
   public void testPropagatesFilesystemInconsistencies_Globbing() throws Exception {
     reporter.removeHandler(failFastHandler);
     RecordingDifferencer differencer = getSkyframeExecutor().getDifferencerForTesting();
@@ -248,6 +261,7 @@
   }
 
   /** Regression test for unexpected exception type from PackageValue. */
+  @Test
   public void testDiscrepancyBetweenLegacyAndSkyframePackageLoadingErrors() throws Exception {
     reporter.removeHandler(failFastHandler);
     Path fooBuildFile = scratch.file("foo/BUILD",
@@ -268,6 +282,7 @@
     assertThat(errorMessage).contains(expectedMessage);
   }
 
+  @Test
   public void testMultipleSubincludesFromSamePackage() throws Exception {
     scratch.file("foo/BUILD",
         "subinclude('//bar:a')",
@@ -286,6 +301,7 @@
     validPackage(skyKey);
   }
 
+  @Test
   public void testTransitiveSubincludesStoredInPackage() throws Exception {
     scratch.file("foo/BUILD",
         "subinclude('//bar:a')");
@@ -318,6 +334,7 @@
         Label.parseAbsolute("//bar:a"), Label.parseAbsolute("//baz:c"));
   }
 
+  @Test
   public void testTransitiveSkylarkDepsStoredInPackage() throws Exception {
     scratch.file("foo/BUILD",
         "load('/bar/ext', 'a')");
@@ -353,6 +370,7 @@
         Label.parseAbsolute("//bar:ext.bzl"), Label.parseAbsolute("//qux:ext.bzl"));
   }
 
+  @Test
   public void testNonExistingSkylarkExtension() throws Exception {
     reporter.removeHandler(failFastHandler);
     scratch.file("test/skylark/BUILD",
@@ -373,6 +391,7 @@
             + "file doesn't exist or isn't a file");
   }
 
+  @Test
   public void testNonExistingSkylarkExtensionWithPythonPreprocessing() throws Exception {
     reporter.removeHandler(failFastHandler);
     scratch.file("foo/BUILD",
@@ -392,6 +411,7 @@
         + "file doesn't exist or isn't a file");
   }
 
+  @Test
   public void testNonExistingSkylarkExtensionFromExtension() throws Exception {
     reporter.removeHandler(failFastHandler);
     scratch.file("test/skylark/extension.bzl",
@@ -415,6 +435,7 @@
             + "file doesn't exist or isn't a file");
   }
 
+  @Test
   public void testSymlinkCycleWithSkylarkExtension() throws Exception {
     reporter.removeHandler(failFastHandler);
     Path extensionFilePath = scratch.resolve("/workspace/test/skylark/extension.bzl");
@@ -438,6 +459,7 @@
             + "file 'test/skylark/extension.bzl': Symlink cycle");
   }
 
+  @Test
   public void testIOErrorLookingForSubpackageForLabelIsHandled() throws Exception {
     reporter.removeHandler(failFastHandler);
     scratch.file("foo/BUILD",
@@ -451,12 +473,14 @@
     assertContainsEvent("nope");
   }
 
+  @Test
   public void testLoadRelativePath() throws Exception {
     scratch.file("pkg/BUILD", "load('ext', 'a')");
     scratch.file("pkg/ext.bzl", "a = 1");
     validPackage(PackageValue.key(PackageIdentifier.parse("pkg")));
   }
 
+  @Test
   public void testLoadAbsolutePath() throws Exception {
     scratch.file("pkg1/BUILD");
     scratch.file("pkg2/BUILD",
@@ -465,6 +489,7 @@
     validPackage(PackageValue.key(PackageIdentifier.parse("pkg2")));
   }
 
+  @Test
   public void testBadWorkspaceFile() throws Exception {
     Path workspacePath = scratch.overwriteFile("WORKSPACE", "junk");
     SkyKey skyKey = PackageValue.key(PackageIdentifier.createInDefaultRepo("external"));
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
index dfc1c44..554bd33 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
@@ -14,6 +14,11 @@
 
 package com.google.devtools.build.lib.skyframe;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.testing.EqualsTester;
@@ -25,7 +30,7 @@
 import com.google.devtools.build.lib.packages.RuleClassProvider;
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.skyframe.PackageLookupValue.ErrorReason;
-import com.google.devtools.build.lib.testutil.FoundationTestCase;
+import com.google.devtools.build.lib.testutil.FoundationTestCaseForJunit4;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.util.BlazeClock;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
@@ -40,6 +45,11 @@
 import com.google.devtools.build.skyframe.SkyFunctionName;
 import com.google.devtools.build.skyframe.SkyKey;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
@@ -48,16 +58,15 @@
 /**
  * Tests for {@link PackageLookupFunction}.
  */
-public class PackageLookupFunctionTest extends FoundationTestCase {
+@RunWith(JUnit4.class)
+public class PackageLookupFunctionTest extends FoundationTestCaseForJunit4 {
   private AtomicReference<ImmutableSet<PackageIdentifier>> deletedPackages;
   private MemoizingEvaluator evaluator;
   private SequentialBuildDriver driver;
   private RecordingDifferencer differencer;
 
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
-
+  @Before
+  public final void setUp() throws Exception {
     Path emptyPackagePath = rootDirectory.getRelative("somewhere/else");
     scratch.file("parentpackage/BUILD");
 
@@ -107,6 +116,7 @@
         NullEventHandler.INSTANCE).get(key);
   }
 
+  @Test
   public void testNoBuildFile() throws Exception {
     scratch.file("parentpackage/nobuildfile/foo.txt");
     PackageLookupValue packageLookupValue = lookupPackage("parentpackage/nobuildfile");
@@ -115,6 +125,7 @@
     assertNotNull(packageLookupValue.getErrorMsg());
   }
 
+  @Test
   public void testNoBuildFileAndNoParentPackage() throws Exception {
     scratch.file("noparentpackage/foo.txt");
     PackageLookupValue packageLookupValue = lookupPackage("noparentpackage");
@@ -123,6 +134,7 @@
     assertNotNull(packageLookupValue.getErrorMsg());
   }
 
+  @Test
   public void testDeletedPackage() throws Exception {
     scratch.file("parentpackage/deletedpackage/BUILD");
     deletedPackages.set(ImmutableSet.of(
@@ -134,6 +146,7 @@
   }
 
 
+  @Test
   public void testBlacklistedPackage() throws Exception {
     scratch.file("blacklisted/subdir/BUILD");
     scratch.file("blacklisted/BUILD");
@@ -160,6 +173,7 @@
     }
   }
 
+  @Test
   public void testInvalidPackageName() throws Exception {
     scratch.file("parentpackage/invalidpackagename%42/BUILD");
     PackageLookupValue packageLookupValue = lookupPackage("parentpackage/invalidpackagename%42");
@@ -169,6 +183,7 @@
     assertNotNull(packageLookupValue.getErrorMsg());
   }
 
+  @Test
   public void testDirectoryNamedBuild() throws Exception {
     scratch.dir("parentpackage/isdirectory/BUILD");
     PackageLookupValue packageLookupValue = lookupPackage("parentpackage/isdirectory");
@@ -178,6 +193,7 @@
     assertNotNull(packageLookupValue.getErrorMsg());
   }
 
+  @Test
   public void testEverythingIsGood() throws Exception {
     scratch.file("parentpackage/everythinggood/BUILD");
     PackageLookupValue packageLookupValue = lookupPackage("parentpackage/everythinggood");
@@ -185,6 +201,7 @@
     assertEquals(rootDirectory, packageLookupValue.getRoot());
   }
 
+  @Test
   public void testEmptyPackageName() throws Exception {
     scratch.file("BUILD");
     PackageLookupValue packageLookupValue = lookupPackage("");
@@ -192,6 +209,7 @@
     assertEquals(rootDirectory, packageLookupValue.getRoot());
   }
 
+  @Test
   public void testWorkspaceLookup() throws Exception {
     scratch.overwriteFile("WORKSPACE");
     PackageLookupValue packageLookupValue = lookupPackage("external");
@@ -200,6 +218,7 @@
   }
 
   // TODO(kchodorow): Clean this up (see TODOs in PackageLookupValue).
+  @Test
   public void testExternalPackageLookupSemantics() {
     PackageLookupValue existing = PackageLookupValue.workspace(rootDirectory);
     assertTrue(existing.isExternalPackage());
@@ -209,6 +228,7 @@
     assertFalse(nonExistent.packageExists());
   }
 
+  @Test
   public void testPackageLookupValueHashCodeAndEqualsContract() throws Exception {
     Path root1 = rootDirectory.getRelative("root1");
     Path root2 = rootDirectory.getRelative("root2");
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ParallelBuilderMediumTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ParallelBuilderMediumTest.java
index 1d923d7..7884ab9 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ParallelBuilderMediumTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ParallelBuilderMediumTest.java
@@ -17,15 +17,21 @@
 import com.google.devtools.build.lib.testutil.Suite;
 import com.google.devtools.build.lib.testutil.TestSpec;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 /**
  * Stress tests for the parallel builder.
  */
 @TestSpec(size = Suite.MEDIUM_TESTS)
+@RunWith(JUnit4.class)
 public class ParallelBuilderMediumTest extends ParallelBuilderTest {
 
   /**
    * A larger set of tests using randomly-generated complex dependency graphs.
    */
+  @Test
   public void testRandomStressTest1() throws Exception {
     final int numTrials = 2;
     final int numArtifacts = 100;
@@ -34,6 +40,7 @@
     test.runStressTest();
   }
 
+  @Test
   public void testRandomStressTest2() throws Exception {
     final int numTrials = 10;
     final int numArtifacts = 10;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ParallelBuilderTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ParallelBuilderTest.java
index b1637b2..4491682 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ParallelBuilderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ParallelBuilderTest.java
@@ -15,6 +15,9 @@
 package com.google.devtools.build.lib.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
@@ -51,6 +54,11 @@
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -70,6 +78,7 @@
  *
  */
 @TestSpec(size = Suite.MEDIUM_TESTS)
+@RunWith(JUnit4.class)
 public class ParallelBuilderTest extends TimestampBuilderTestCase {
 
   private static final Logger LOG =
@@ -79,9 +88,8 @@
 
   protected static final int DEFAULT_NUM_JOBS = 100;
 
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
+  @Before
+  public final void setUp() throws Exception {
     this.cache = new InMemoryActionCache();
     ResourceManager.instance().setAvailableResources(LocalHostCapacity.getLocalHostCapacity());
     ResourceManager.instance().setRamUtilizationPercentage(
@@ -188,6 +196,7 @@
     }
   }
 
+  @Test
   public void testReportsActionExecutedEvent() throws Exception {
     Artifact pear = createDerivedArtifact("pear");
     ActionEventRecorder recorder = new ActionEventRecorder();
@@ -202,6 +211,7 @@
     assertEquals(action, recorder.actionExecutedEvents.get(0).getAction());
   }
 
+  @Test
   public void testRunsInParallel() throws Exception {
     runsInParallelWithBuilder(createBuilder(DEFAULT_NUM_JOBS, false));
   }
@@ -209,6 +219,7 @@
   /**
    * Test that we can recover properly after a failed build.
    */
+  @Test
   public void testFailureRecovery() throws Exception {
 
     // [action] -> foo
@@ -243,6 +254,7 @@
     buildArtifacts(bar);
   }
 
+  @Test
   public void testUpdateCacheError() throws Exception {
     FileSystem fs = new InMemoryFileSystem() {
       @Override
@@ -307,6 +319,7 @@
     }
   }
 
+  @Test
   public void testNullBuild() throws Exception {
     // BuildTool.setupLogging(Level.FINEST);
     LOG.fine("Testing null build...");
@@ -316,6 +329,7 @@
   /**
    * Test a randomly-generated complex dependency graph.
    */
+  @Test
   public void testSmallRandomStressTest() throws Exception {
     final int numTrials = 1;
     final int numArtifacts = 30;
@@ -508,6 +522,7 @@
 
   // Regression test for bug fixed in CL 3548332: builder was not waiting for
   // all its subprocesses to terminate.
+  @Test
   public void testWaitsForSubprocesses() throws Exception {
     final Semaphore semaphore = new Semaphore(1);
     final boolean[] finished = { false };
@@ -561,6 +576,7 @@
                finished[0]);
   }
 
+  @Test
   public void testSchedulingOfMemoryResources() throws Exception {
     // The action graph consists of 100 independent actions, but execution is
     // memory limited: only 6 TestActions can run concurrently:
@@ -606,6 +622,7 @@
     assertEquals(6, counter.maxConcurrent);
   }
 
+  @Test
   public void testEstimateExceedsAvailableRam() throws Exception {
     // Pretend that the machine has only 1MB of RAM available,
     // then test running an action that we estimate requires 2MB of RAM.
@@ -632,6 +649,7 @@
     assertTrue(finished[0]);
   }
 
+  @Test
   public void testCyclicActionGraph() throws Exception {
     // foo -> [action] -> bar
     // bar -> [action] -> baz
@@ -650,6 +668,7 @@
     }
   }
 
+  @Test
   public void testSelfCyclicActionGraph() throws Exception {
     // foo -> [action] -> foo
     Artifact foo = createDerivedArtifact("foo");
@@ -662,6 +681,7 @@
     }
   }
 
+  @Test
   public void testCycleInActionGraphBelowTwoActions() throws Exception {
     // bar -> [action] -> foo1
     // bar -> [action] -> foo2
@@ -684,6 +704,7 @@
   }
 
 
+  @Test
   public void testCyclicActionGraphWithTail() throws Exception {
     // bar -> [action] -> foo
     // baz -> [action] -> bar
@@ -704,6 +725,7 @@
     }
   }
 
+  @Test
   public void testDuplicatedInput() throws Exception {
     // <null> -> [action] -> foo
     // (foo, foo) -> [action] -> bar
@@ -784,10 +806,12 @@
     }
   }
 
+   @Test
    public void testNoNewJobsAreRunAfterFirstFailure() throws Exception {
      assertNoNewJobsAreRunAfterFirstFailure(false, false);
    }
 
+   @Test
    public void testNoNewJobsAreRunAfterCatastrophe() throws Exception {
      assertNoNewJobsAreRunAfterFirstFailure(true, true);
    }
@@ -800,6 +824,7 @@
     return artifact;
   }
 
+  @Test
   public void testProgressReporting() throws Exception {
     // Build three artifacts in 3 separate actions (baz depends on bar and bar
     // depends on foo.  Make sure progress is reported at the beginning of all
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
index a1e5e9a..107f577 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
@@ -14,10 +14,12 @@
 package com.google.devtools.build.lib.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.analysis.util.BuildViewTestCaseForJunit4;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -26,10 +28,15 @@
 import com.google.devtools.build.skyframe.SkyValue;
 import com.google.devtools.build.skyframe.WalkableGraph;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.io.IOException;
 
 /** Tests for {@link PrepareDepsOfPatternsFunction}. */
-public class PrepareDepsOfPatternsFunctionSmartNegationTest extends BuildViewTestCase {
+@RunWith(JUnit4.class)
+public class PrepareDepsOfPatternsFunctionSmartNegationTest extends BuildViewTestCaseForJunit4 {
 
   private static SkyKey getKeyForLabel(Label label) {
     // Note that these tests used to look for TargetMarker SkyKeys before TargetMarker was
@@ -38,6 +45,7 @@
     return TransitiveTraversalValue.key(label);
   }
 
+  @Test
   public void testRecursiveEvaluationFailsOnBadBuildFile() throws Exception {
     // Given a well-formed package "//foo" and a malformed package "//foo/foo",
     createFooAndFooFoo();
@@ -59,6 +67,7 @@
     assertFalse(walkableGraph.exists(getKeyForLabel(Label.create("foo/foo", "foofoo"))));
   }
 
+  @Test
   public void testNegativePatternBlocksPatternEvaluation() throws Exception {
     // Given a well-formed package "//foo" and a malformed package "//foo/foo",
     createFooAndFooFoo();
@@ -70,6 +79,7 @@
     assertSkipsFoo(patternSequence);
   }
 
+  @Test
   public void testBlacklistPatternBlocksPatternEvaluation() throws Exception {
     // Given a well-formed package "//foo" and a malformed package "//foo/foo",
     createFooAndFooFoo();
@@ -104,6 +114,7 @@
     assertFalse(walkableGraph.exists(getKeyForLabel(label)));
   }
 
+  @Test
   public void testNegativeNonTBDPatternsAreSkippedWithWarnings() throws Exception {
     // Given a target pattern sequence with a negative non-TBD pattern,
     ImmutableList<String> patternSequence = ImmutableList.of("-//foo/bar");
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionTest.java
index d7b9e5f..9c872cf 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionTest.java
@@ -14,10 +14,14 @@
 package com.google.devtools.build.lib.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.analysis.util.BuildViewTestCaseForJunit4;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.NoSuchPackageException;
 import com.google.devtools.build.lib.packages.NoSuchTargetException;
@@ -26,10 +30,15 @@
 import com.google.devtools.build.skyframe.SkyValue;
 import com.google.devtools.build.skyframe.WalkableGraph;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.io.IOException;
 
 /** Tests for {@link com.google.devtools.build.lib.skyframe.PrepareDepsOfPatternsFunction}. */
-public class PrepareDepsOfPatternsFunctionTest extends BuildViewTestCase {
+@RunWith(JUnit4.class)
+public class PrepareDepsOfPatternsFunctionTest extends BuildViewTestCaseForJunit4 {
 
   private static SkyKey getKeyForLabel(Label label) {
     // Note that these tests used to look for TargetMarker SkyKeys before TargetMarker was
@@ -38,6 +47,7 @@
     return TransitiveTraversalValue.key(label);
   }
 
+  @Test
   public void testFunctionLoadsTargetAndNotUnspecifiedTargets() throws Exception {
     // Given a package "//foo" with independent target rules ":foo" and ":foo2",
     createFooAndFoo2(/*dependent=*/ false);
@@ -56,6 +66,7 @@
     assertFalse(walkableGraph.exists(getKeyForLabel(Label.create("foo", "foo2"))));
   }
 
+  @Test
   public void testFunctionLoadsTargetDependencies() throws Exception {
     // Given a package "//foo" with target rules ":foo" and ":foo2",
     // And given ":foo" depends on ":foo2",
@@ -72,6 +83,7 @@
     assertValidValue(walkableGraph, getKeyForLabel(Label.create("foo", "foo2")));
   }
 
+  @Test
   public void testFunctionExpandsTargetPatterns() throws Exception {
     // Given a package "//foo" with independent target rules ":foo" and ":foo2",
     createFooAndFoo2(/*dependent=*/ false);
@@ -88,6 +100,7 @@
     assertValidValue(walkableGraph, getKeyForLabel(Label.create("foo", "foo2")));
   }
 
+  @Test
   public void testTargetParsingException() throws Exception {
     // Given no packages, and a target pattern sequence referring to a non-existent target,
     String nonexistentTarget = "//foo:foo";
@@ -101,6 +114,7 @@
     assertFalse(walkableGraph.exists(getKeyForLabel(Label.create("foo", "foo"))));
   }
 
+  @Test
   public void testDependencyTraversalNoSuchPackageException() throws Exception {
     // Given a package "//foo" with a target ":foo" that has a dependency on a non-existent target
     // "//bar:bar" in a non-existent package "//bar",
@@ -124,6 +138,7 @@
     assertThat(e).isInstanceOf(NoSuchPackageException.class);
   }
 
+  @Test
   public void testDependencyTraversalNoSuchTargetException() throws Exception {
     // Given a package "//foo" with a target ":foo" that has a dependency on a non-existent target
     // "//bar:bar" in an existing package "//bar",
@@ -147,6 +162,7 @@
     assertThat(e).isInstanceOf(NoSuchTargetException.class);
   }
 
+  @Test
   public void testParsingProblemsKeepGoing() throws Exception {
     parsingProblem(/*keepGoing=*/ true);
   }
@@ -157,6 +173,7 @@
    * always used {@code keepGoing=true} during target pattern parsing because it was responsible
    * for ensuring that queries had a complete graph to work on.
    */
+  @Test
   public void testParsingProblemsNoKeepGoing() throws Exception {
     parsingProblem(/*keepGoing=*/ false);
   }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunctionTest.java
index 7574951..0fbb4ec 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunctionTest.java
@@ -15,12 +15,14 @@
 package com.google.devtools.build.lib.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
-import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.analysis.util.BuildViewTestCaseForJunit4;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.pkgcache.FilteringPolicies;
@@ -33,18 +35,23 @@
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.WalkableGraph;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.io.IOException;
 
 /**
  * Tests for {@link PrepareDepsOfTargetsUnderDirectoryFunction}. Insert excuses here.
  */
-public class PrepareDepsOfTargetsUnderDirectoryFunctionTest extends BuildViewTestCase {
+@RunWith(JUnit4.class)
+public class PrepareDepsOfTargetsUnderDirectoryFunctionTest extends BuildViewTestCaseForJunit4 {
 
   private SkyframeExecutor skyframeExecutor;
 
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
+  @Before
+  public final void setSkyframeExecutor() throws Exception {
     skyframeExecutor = getSkyframeExecutor();
   }
 
@@ -76,6 +83,7 @@
     return evaluationResult;
   }
 
+  @Test
   public void testTransitiveLoading() throws Exception {
     // Given a package "a" with a genrule "a" that depends on a target in package "b",
     createPackages();
@@ -100,6 +108,7 @@
     assertThat(graph.exists(bTxtKey)).isTrue();
   }
 
+  @Test
   public void testTargetFilterSensitivity() throws Exception {
     // Given a package "a" with a genrule "a" that depends on a target in package "b", and a test
     // rule "aTest",
@@ -133,6 +142,7 @@
         "exports_files(['b.txt'])");
   }
 
+  @Test
   public void testSubdirectoryExclusion() throws Exception {
     // Given a package "a" with two packages below it, "a/b" and "a/c",
     scratch.file("a/BUILD");
@@ -170,6 +180,7 @@
         ImmutableSet.<PathFragment>of())));
   }
 
+  @Test
   public void testExcludedSubdirectoryGettingPassedDown() throws Exception {
     // Given a package "a", and a package below it in "a/b/c", and a non-BUILD file below it in
     // "a/b/d",
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
index a4367e0..d94b8dd 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
@@ -31,7 +31,7 @@
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalValue.ResolvedFile;
 import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalValue.TraversalRequest;
-import com.google.devtools.build.lib.testutil.FoundationTestCase;
+import com.google.devtools.build.lib.testutil.FoundationTestCaseForJunit4;
 import com.google.devtools.build.lib.util.BlazeClock;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
 import com.google.devtools.build.lib.vfs.Path;
@@ -49,6 +49,11 @@
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
@@ -60,7 +65,8 @@
 import java.util.regex.Pattern;
 
 /** Tests for {@link RecursiveFilesystemTraversalFunction}. */
-public final class RecursiveFilesystemTraversalFunctionTest extends FoundationTestCase {
+@RunWith(JUnit4.class)
+public final class RecursiveFilesystemTraversalFunctionTest extends FoundationTestCaseForJunit4 {
 
   private TimestampGranularityMonitor tsgm = new TimestampGranularityMonitor(BlazeClock.instance());
   private RecordingEvaluationProgressReceiver progressReceiver;
@@ -69,10 +75,8 @@
   private RecordingDifferencer differencer;
   private AtomicReference<PathPackageLocator> pkgLocator;
 
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
-
+  @Before
+  public final void setUp() throws Exception  {
     pkgLocator = new AtomicReference<>(
         new PathPackageLocator(outputBase, ImmutableList.of(rootDirectory)));
     AtomicReference<ImmutableSet<PackageIdentifier>> deletedPackages =
@@ -334,14 +338,17 @@
     progressReceiver.clear();
   }
 
+  @Test
   public void testTraversalOfSourceFile() throws Exception {
     assertTraversalOfFile(sourceArtifact("foo/bar.txt"));
   }
 
+  @Test
   public void testTraversalOfGeneratedFile() throws Exception {
     assertTraversalOfFile(derivedArtifact("foo/bar.txt"));
   }
 
+  @Test
   public void testTraversalOfSymlinkToFile() throws Exception {
     Artifact linkNameArtifact = sourceArtifact("foo/baz/qux.sym");
     Artifact linkTargetArtifact = sourceArtifact("foo/bar/baz.txt");
@@ -368,6 +375,7 @@
     assertThat(v2).isNotEqualTo(v1);
   }
 
+  @Test
   public void testTraversalOfTransitiveSymlinkToFile() throws Exception {
     Artifact directLinkArtifact = sourceArtifact("direct/file.sym");
     Artifact transitiveLinkArtifact = sourceArtifact("transitive/sym.sym");
@@ -443,14 +451,17 @@
     assertThat(progressReceiver.invalidations).doesNotContain(rftvSkyKey(traversalRoot));
   }
 
+  @Test
   public void testTraversalOfSourceDirectory() throws Exception {
     assertTraversalOfDirectory(sourceArtifact("dir"));
   }
 
+  @Test
   public void testTraversalOfGeneratedDirectory() throws Exception {
     assertTraversalOfDirectory(derivedArtifact("dir"));
   }
 
+  @Test
   public void testTraversalOfTransitiveSymlinkToDirectory() throws Exception {
     Artifact directLinkArtifact = sourceArtifact("direct/dir.sym");
     Artifact transitiveLinkArtifact = sourceArtifact("transitive/sym.sym");
@@ -478,6 +489,7 @@
         resolvedFile(childOf(transitiveLinkArtifact, "file.a")));
   }
 
+  @Test
   public void testTraversePackage() throws Exception {
     Artifact buildFile = sourceArtifact("pkg/BUILD");
     RootedPath buildFilePath = createFile(rootedPath(buildFile));
@@ -489,6 +501,7 @@
         resolvedFile(file1));
   }
 
+  @Test
   public void testTraversalOfSymlinkToDirectory() throws Exception {
     Artifact linkNameArtifact = sourceArtifact("link/foo.sym");
     Artifact linkTargetArtifact = sourceArtifact("dir");
@@ -543,6 +556,7 @@
     assertThat(progressReceiver.invalidations).doesNotContain(rftvSkyKey(traversalRoot));
   }
 
+  @Test
   public void testTraversalOfDanglingSymlink() throws Exception {
     Artifact linkArtifact = sourceArtifact("a/dangling.sym");
     RootedPath link = rootedPath(linkArtifact);
@@ -553,6 +567,7 @@
         fileLikeRoot(linkArtifact, DONT_CROSS), resolvedDanglingSymlink(link, linkTarget));
   }
 
+  @Test
   public void testTraversalOfDanglingSymlinkInADirectory() throws Exception {
     Artifact dirArtifact = sourceArtifact("a");
     RootedPath file = createFile(childOf(dirArtifact, "file.txt"));
@@ -599,18 +614,22 @@
     }
   }
 
+  @Test
   public void testTraverseSubpackages() throws Exception {
     assertTraverseSubpackages(CROSS);
   }
 
+  @Test
   public void testDoNotTraverseSubpackages() throws Exception {
     assertTraverseSubpackages(DONT_CROSS);
   }
 
+  @Test
   public void testReportErrorWhenTraversingSubpackages() throws Exception {
     assertTraverseSubpackages(REPORT_ERROR);
   }
 
+  @Test
   public void testSwitchPackageRootsWhenUsingMultiplePackagePaths() throws Exception {
     // Layout:
     //   pp1://a/BUILD
@@ -688,6 +707,7 @@
         resolvedFile(pp1aSubdirFileB));
   }
 
+  @Test
   public void testFileDigestChangeCausesRebuild() throws Exception {
     Artifact artifact = sourceArtifact("foo/bar.txt");
     RootedPath path = rootedPath(artifact);
@@ -707,6 +727,7 @@
     assertThat(v2).isNotEqualTo(v1);
   }
 
+  @Test
   public void testFileMtimeChangeDoesNotCauseRebuildIfDigestIsUnchanged() throws Exception {
     Artifact artifact = sourceArtifact("foo/bar.txt");
     RootedPath path = rootedPath(artifact);
@@ -727,6 +748,7 @@
     assertThat(v2).isEqualTo(v1);
   }
 
+  @Test
   public void testRegexp() throws Exception {
     Artifact wantedArtifact = sourceArtifact("foo/bar/baz.txt");
     Artifact unwantedArtifact = sourceArtifact("foo/boo/baztxt.bak");
@@ -745,6 +767,7 @@
     traverseAndAssertFiles(traversalRoot, expected);
   }
 
+  @Test
   public void testGeneratedDirectoryConflictsWithPackage() throws Exception {
     Artifact genDir = derivedArtifact("a/b");
     createFile(rootedPath(sourceArtifact("a/b/c/file.real")));
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunctionTest.java
index ce2b84d..8b0cc1b 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunctionTest.java
@@ -14,12 +14,15 @@
 package com.google.devtools.build.lib.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
-import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.analysis.util.BuildViewTestCaseForJunit4;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -29,6 +32,11 @@
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.WalkableGraph;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 /**
  * Tests for {@link RecursivePkgFunction}. Unfortunately, we can't directly test
  * RecursivePkgFunction as it uses PackageValues, and PackageFunction uses legacy stuff that
@@ -38,13 +46,13 @@
  * <p>Target parsing tests already cover most of the behavior of RecursivePkgFunction, but there
  * are a couple of corner cases we need to test directly.
  */
-public class RecursivePkgFunctionTest extends BuildViewTestCase {
+@RunWith(JUnit4.class)
+public class RecursivePkgFunctionTest extends BuildViewTestCaseForJunit4 {
 
   private SkyframeExecutor skyframeExecutor;
 
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
+  @Before
+  public final void createSkyframeExecutor() throws Exception {
     skyframeExecutor = getSkyframeExecutor();
   }
 
@@ -80,6 +88,7 @@
     return evaluationResult;
   }
 
+  @Test
   public void testStartingAtBuildFile() throws Exception {
     scratch.file("a/b/c/BUILD");
     RecursivePkgValue value =
@@ -87,6 +96,7 @@
     assertTrue(value.getPackages().isEmpty());
   }
 
+  @Test
   public void testPackagesUnderMultipleRoots() throws Exception {
     Path root1 = rootDirectory.getRelative("root1");
     Path root2 = rootDirectory.getRelative("root2");
@@ -105,6 +115,7 @@
     assertEquals(root2Pkg, "a/b");
   }
 
+  @Test
   public void testSubdirectoryExclusion() throws Exception {
     // Given a package "a" with two packages below it, "a/b" and "a/c",
     scratch.file("a/BUILD");
@@ -141,6 +152,7 @@
                 rootDirectory, new PathFragment("a/c"), ImmutableSet.<PathFragment>of())));
   }
 
+  @Test
   public void testExcludedSubdirectoryGettingPassedDown() throws Exception {
     // Given a package "a" with two packages below a directory below it, "a/b/c" and "a/b/d",
     scratch.file("a/BUILD");
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgKeyTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgKeyTest.java
index 4c312db..2e5df9e 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgKeyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgKeyTest.java
@@ -13,8 +13,10 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skyframe;
 
+import static org.junit.Assert.fail;
+
 import com.google.common.collect.ImmutableSet;
-import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.analysis.util.BuildViewTestCaseForJunit4;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
 import com.google.devtools.build.lib.skyframe.RecursivePkgValue.RecursivePkgKey;
@@ -22,8 +24,13 @@
 import com.google.devtools.build.lib.vfs.RootedPath;
 import com.google.devtools.build.skyframe.SkyKey;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 /** Tests for {@link RecursivePkgKey}. */
-public class RecursivePkgKeyTest extends BuildViewTestCase {
+@RunWith(JUnit4.class)
+public class RecursivePkgKeyTest extends BuildViewTestCaseForJunit4 {
 
   private SkyKey buildRecursivePkgKey(
       RepositoryName repository,
@@ -43,6 +50,7 @@
     }
   }
 
+  @Test
   public void testValidRecursivePkgKeys() throws Exception {
     buildRecursivePkgKey(
         PackageIdentifier.DEFAULT_REPOSITORY_NAME,
@@ -72,6 +80,7 @@
         ImmutableSet.of(new PathFragment("a/b/c")));
   }
 
+  @Test
   public void testInvalidRecursivePkgKeys() throws Exception {
     invalidHelper(new PathFragment(""), ImmutableSet.of(new PathFragment("")));
     invalidHelper(new PathFragment("a"), ImmutableSet.of(new PathFragment("a")));
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java
index 282bb51..219b6e2 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java
@@ -41,6 +41,11 @@
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -52,16 +57,20 @@
 import javax.annotation.Nullable;
 
 /** Tests for {@link SkyframeAwareAction}. */
+@RunWith(JUnit4.class)
 public class SkyframeAwareActionTest extends TimestampBuilderTestCase {
   private Builder builder;
   private Executor executor;
   private TrackingEvaluationProgressReceiver invalidationReceiver;
 
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
+  @Before
+  public final void createBuilder() throws Exception {
     invalidationReceiver = new TrackingEvaluationProgressReceiver();
     builder = createBuilder(inMemoryCache, 1, /*keepGoing=*/ false, invalidationReceiver);
+  }
+
+  @Before
+  public final void createExecutor() throws Exception {
     executor = new DummyExecutor(rootDirectory);
   }
 
@@ -454,10 +463,12 @@
     }
   }
 
+  @Test
   public void testCacheCheckingActionWithContentChangingInput() throws Exception {
     assertActionWithContentChangingInput(/* unconditionalExecution */ false);
   }
 
+  @Test
   public void testCacheBypassingActionWithContentChangingInput() throws Exception {
     assertActionWithContentChangingInput(/* unconditionalExecution */ true);
   }
@@ -481,10 +492,12 @@
         ExpectActionIs.REEXECUTED);
   }
 
+  @Test
   public void testCacheCheckingActionWithMtimeChangingInput() throws Exception {
     assertActionWithMtimeChangingInput(/* unconditionalExecution */ false);
   }
 
+  @Test
   public void testCacheBypassingActionWithMtimeChangingInput() throws Exception {
     assertActionWithMtimeChangingInput(/* unconditionalExecution */ true);
   }
@@ -558,19 +571,23 @@
         ExpectActionIs.REEXECUTED);
   }
 
+  @Test
   public void testActionWithNonChangingInputButChangingSkyframeDeps() throws Exception {
     assertActionWithMaybeChangingInputAndChangingSkyframeDeps(ChangeArtifact.DONT_CHANGE);
   }
 
+  @Test
   public void testActionWithChangingInputMtimeAndChangingSkyframeDeps() throws Exception {
     assertActionWithMaybeChangingInputAndChangingSkyframeDeps(ChangeArtifact.CHANGE_MTIME);
   }
 
+  @Test
   public void testActionWithChangingInputAndChangingSkyframeDeps() throws Exception {
     assertActionWithMaybeChangingInputAndChangingSkyframeDeps(
         ChangeArtifact.CHANGE_MTIME_AND_CONTENT);
   }
 
+  @Test
   public void testActionWithNonChangingInputAndNonChangingSkyframeDeps() throws Exception {
     final SkyKey skyframeDep = FileStateValue.key(createSkyframeDepOfAction());
 
@@ -688,6 +705,7 @@
    * are missing, request also the skyframe-dependencies. The race is described in this method's
    * body.
    */
+  @Test
   public void testRaceConditionBetweenInputAcquisitionAndSkyframeDeps() throws Exception {
     // Sequence of events on threads A and B, showing SkyFunctions and requested SkyKeys, leading
     // to an InconsistentFilesystemException:
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java
index a145b07..7c7fc4b 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java
@@ -14,6 +14,8 @@
 package com.google.devtools.build.lib.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
@@ -31,16 +33,23 @@
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.io.IOException;
 import java.util.Collection;
 import java.util.UUID;
 
+@RunWith(JUnit4.class)
 public class SkyframeLabelVisitorTest extends SkyframeLabelVisitorTestCase {
 
+  @Override
   public PackageFactory.EnvironmentExtension getPackageEnvironmentExtension() {
     return new PackageFactory.EmptyEnvironmentExtension();
   }
 
+  @Test
   public void testLabelVisitorDetectsMissingPackages() throws Exception {
     reporter.removeHandler(failFastHandler); // expect errors
 
@@ -56,6 +65,7 @@
    * Tests that Blaze is resilient to changing symlinks between builds. This test is a more
    * "integrated" version of FilesystemValueCheckerTest#testDirtySymlink.
    */
+  @Test
   public void testChangingSymlink() throws Exception {
     Path path = scratch.file("foo/BUILD", "sh_library(name = 'foo')");
     Path sym1 = scratch.resolve(rootDirectory + "/sym1/BUILD");
@@ -84,6 +94,7 @@
         ImmutableSet.of("//bar:bar"), ImmutableSet.of("//bar:bar"), !EXPECT_ERROR, !KEEP_GOING);
   }
 
+  @Test
   public void testFailFastLoading() throws Exception {
     reporter.removeHandler(failFastHandler); // expect errors
 
@@ -118,6 +129,7 @@
         !KEEP_GOING);
   }
 
+  @Test
   public void testNewFailure() throws Exception {
     reporter.removeHandler(failFastHandler); // expect errors
 
@@ -140,6 +152,7 @@
         ImmutableSet.of("//pkg:x"), ImmutableSet.of("//pkg:x"), EXPECT_ERROR, !KEEP_GOING);
   }
 
+  @Test
   public void testNewTransitiveFailure() throws Exception {
     reporter.removeHandler(failFastHandler); // expect errors
 
@@ -172,6 +185,7 @@
         KEEP_GOING);
   }
 
+  @Test
   public void testAddDepInNewPkg() throws Exception {
     Path buildFile =
         scratch.file("pkg/BUILD", "sh_library(name = 'x', deps = ['z'])", "sh_library(name = 'z')");
@@ -203,6 +217,7 @@
 
   // Regression test for: "IllegalArgumentException thrown during build."  This happened if "."
   // occurred in a label name segment.
+  @Test
   public void testDotLabelName() throws Exception {
     scratch.file("pkg/BUILD", "exports_files(srcs = ['.', 'x/.'])");
 
@@ -221,6 +236,7 @@
         !KEEP_GOING);
   }
 
+  @Test
   public void testLabelVisitorPlural() throws Exception {
     reporter.removeHandler(failFastHandler); // expect errors
 
@@ -237,6 +253,7 @@
   }
 
   // Indirectly tests that there are dependencies between packages and their subpackages.
+  @Test
   public void testSubpackageBoundaryAdd() throws Exception {
     scratch.file(
         "x/BUILD", "sh_library(name = 'x', deps = ['//x:y/z'])", "sh_library(name = 'y/z')");
@@ -257,6 +274,7 @@
   }
 
   // Indirectly tests that there are dependencies between packages and their subpackages.
+  @Test
   public void testSubpackageBoundaryDelete() throws Exception {
     reporter.removeHandler(failFastHandler); // expect errors
     scratch.file(
@@ -273,6 +291,7 @@
         ImmutableSet.of("//x:x", "//x:y/z"), ImmutableSet.of("//x:x"), !EXPECT_ERROR, !KEEP_GOING);
   }
 
+  @Test
   public void testInterruptPending() throws Exception {
     scratch.file("x/BUILD");
     Thread.currentThread().interrupt();
@@ -286,6 +305,7 @@
   }
 
   // Regression test for "crash when // encountered in package name".
+  @Test
   public void testDoubleSlashInPackageName() throws Exception {
     reporter.removeHandler(failFastHandler); // expect errors
     scratch.file("x/BUILD", "sh_library(name='x', deps=['//x//y'])");
@@ -297,6 +317,7 @@
   }
 
   // Regression test for "Bazel hangs on input of illegal rule".
+  @Test
   public void testCrashInLoadPackageIsReportedEffectively() throws Exception {
     reporter.removeHandler(failFastHandler);
     // Inject a NullPointerException into loadPackage().  This is triggered by
@@ -337,6 +358,7 @@
 
   // Regression test for: "Need better context for missing build file error due to
   // use in visibility rule".
+  @Test
   public void testErrorMessageContainsTarget() throws Exception {
     reporter.removeHandler(failFastHandler); // expect errors
 
@@ -352,6 +374,7 @@
             + "such package 'not/a/package'");
   }
 
+  @Test
   public void testKeepGoing() throws Exception {
     reporter.removeHandler(failFastHandler);
     scratch.file(
@@ -370,6 +393,7 @@
    * In the case of Skyframe we print a warning inside SkyframeLabelVisitor because the existing
    * interfaces forces us to do the keep_going + show warning logic there.
    */
+  @Test
   public void testNewBuildFileConflict() throws Exception {
     Collection<Event> warnings = assertNewBuildFileConflict();
     assertThat(warnings).hasSize(1);
@@ -377,6 +401,7 @@
         .contains("errors encountered while analyzing target '//pkg:x': it will not be built");
   }
 
+  @Test
   public void testWithNoSubincludes() throws Exception {
     // This test uses the preprocessor.
     preprocessorFactorySupplier.inject(
@@ -417,6 +442,7 @@
   //
   // Indirectly tests that there are dependencies between a package and other packages that could
   // potentially cutoff its subincludes.
+  @Test
   public void testSubpackageBoundarySubincludes() throws Exception {
     // This test uses the python preprocessor.
     preprocessorFactorySupplier.inject(
@@ -451,6 +477,7 @@
   }
 
   // Regression test for: "ClassCastException in SkyframeLabelVisitor.sync()"
+  @Test
   public void testRootCauseOnInconsistentFilesystem() throws Exception {
     reporter.removeHandler(failFastHandler);
     scratch.file("foo/BUILD", "sh_library(name = 'foo', deps = ['//bar:baz/fizz'])");
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTestCase.java
index ed27884..45d8cd8 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTestCase.java
@@ -13,13 +13,14 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skyframe;
 
-import com.google.common.base.Predicates;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertTrue;
+
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
-import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
@@ -31,32 +32,28 @@
 import com.google.devtools.build.lib.packages.Package;
 import com.google.devtools.build.lib.packages.PackageFactory;
 import com.google.devtools.build.lib.packages.Target;
-import com.google.devtools.build.lib.packages.util.PackageLoadingTestCase;
+import com.google.devtools.build.lib.packages.util.PackageLoadingTestCaseForJunit4;
 import com.google.devtools.build.lib.packages.util.PreprocessorUtils;
-import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.pkgcache.TransitivePackageLoader;
 import com.google.devtools.build.lib.testutil.ManualClock;
-import com.google.devtools.build.lib.util.BlazeClock;
-import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
 import com.google.devtools.build.lib.vfs.FileStatus;
 import com.google.devtools.build.lib.vfs.FileSystem;
 import com.google.devtools.build.lib.vfs.ModifiedFileSet;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
-import com.google.devtools.build.skyframe.SkyFunction;
-import com.google.devtools.build.skyframe.SkyFunctionName;
+
+import org.junit.Before;
 
 import java.io.IOException;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
-import java.util.UUID;
 
 import javax.annotation.Nullable;
 
-abstract public class SkyframeLabelVisitorTestCase extends PackageLoadingTestCase {
+abstract public class SkyframeLabelVisitorTestCase extends PackageLoadingTestCaseForJunit4 {
   // Convenience constants, so test args are readable vs true/false
   protected static final boolean KEEP_GOING = true;
   protected static final boolean EXPECT_ERROR = true;
@@ -239,31 +236,11 @@
     return builder.build();
   }
 
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
-    this.skyframeExecutor =
-        SequencedSkyframeExecutor.create(
-            new PackageFactory(ruleClassProvider, getPackageEnvironmentExtension()),
-            new TimestampGranularityMonitor(BlazeClock.instance()),
-            new BlazeDirectories(outputBase, outputBase, rootDirectory),
-            null, /* BinTools -- not used */
-            null, /* workspaceStatusActionFactory -- not used */
-            ruleClassProvider.getBuildInfoFactories(),
-            ImmutableSet.<Path>of(),
-            ImmutableList.<DiffAwareness.Factory>of(),
-            Predicates.<PathFragment>alwaysFalse(),
-            preprocessorFactorySupplier,
-            ImmutableMap.<SkyFunctionName, SkyFunction>of(),
-            ImmutableList.<PrecomputedValue.Injected>of(),
-            ImmutableList.<SkyValueDirtinessChecker>of());
-    skyframeExecutor.preparePackageLoading(
-        new PathPackageLocator(outputBase, ImmutableList.of(rootDirectory)),
-        ConstantRuleVisibility.PRIVATE,
-        true,
-        7,
-        ruleClassProvider.getDefaultsPackageContent(),
-        UUID.randomUUID());
+  @Before
+  public final void initializeVisitor() throws Exception {
+    skyframeExecutor = super.createSkyframeExecutor(
+        ImmutableList.of(getPackageEnvironmentExtension()), preprocessorFactorySupplier,
+        ConstantRuleVisibility.PRIVATE, ruleClassProvider.getDefaultsPackageContent());
     this.visitor = skyframeExecutor.pkgLoader();
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
index 18c0d35..8c2087f 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
@@ -13,8 +13,11 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skyframe;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.analysis.util.BuildViewTestCaseForJunit4;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.packages.ConstantRuleVisibility;
 import com.google.devtools.build.lib.packages.Rule;
@@ -24,6 +27,11 @@
 import com.google.devtools.build.skyframe.EvaluationResult;
 import com.google.devtools.build.skyframe.SkyKey;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.util.Collection;
 import java.util.UUID;
 
@@ -31,11 +39,11 @@
  * Tests for the hash code calculated for Skylark RuleClasses based on the transitive closure
  * of the imports of their respective definition SkylarkEnvironments.
  */
-public class SkylarkFileContentHashTests extends BuildViewTestCase {
+@RunWith(JUnit4.class)
+public class SkylarkFileContentHashTests extends BuildViewTestCaseForJunit4 {
 
-  @Override
-  public void setUp() throws Exception {
-    super.setUp();
+  @Before
+  public final void createFiles() throws Exception  {
     scratch.file("foo/BUILD");
     scratch.file("bar/BUILD");
     scratch.file("helper/BUILD");
@@ -66,10 +74,12 @@
         "bar1(name = 'bar1')");
   }
 
+  @Test
   public void testHashInvariance() throws Exception {
     assertEquals(getHash("pkg", "foo1"), getHash("pkg", "foo1"));
   }
 
+  @Test
   public void testHashInvarianceAfterOverwritingFileWithSameContents() throws Exception {
     String bar1 = getHash("pkg", "bar1");
     scratch.overwriteFile(
@@ -81,14 +91,17 @@
     assertEquals(bar1, getHash("pkg", "bar1"));
   }
 
+  @Test
   public void testHashSameForRulesDefinedInSameFile() throws Exception {
     assertEquals(getHash("pkg", "foo1"), getHash("pkg", "foo2"));
   }
 
+  @Test
   public void testHashNotSameForRulesDefinedInDifferentFiles() throws Exception {
     assertNotEquals(getHash("pkg", "foo1"), getHash("pkg", "bar1"));
   }
 
+  @Test
   public void testImmediateFileChangeChangesHash() throws Exception {
     String bar1 = getHash("pkg", "bar1");
     scratch.overwriteFile(
@@ -101,6 +114,7 @@
     assertNotEquals(bar1, getHash("pkg", "bar1"));
   }
 
+  @Test
   public void testTransitiveFileChangeChangesHash() throws Exception {
     String bar1 = getHash("pkg", "bar1");
     String foo1 = getHash("pkg", "foo1");
@@ -116,6 +130,7 @@
     assertNotEquals(foo2, getHash("pkg", "foo2"));
   }
 
+  @Test
   public void testFileChangeDoesNotAffectRulesDefinedOutsideOfTransitiveClosure() throws Exception {
     String foo1 = getHash("pkg", "foo1");
     String foo2 = getHash("pkg", "foo2");
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunctionTest.java
index 99999be..0682d79 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunctionTest.java
@@ -13,8 +13,12 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skyframe;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.analysis.util.BuildViewTestCaseForJunit4;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.ConstantRuleVisibility;
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
@@ -24,16 +28,21 @@
 import com.google.devtools.build.skyframe.EvaluationResult;
 import com.google.devtools.build.skyframe.SkyKey;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.util.UUID;
 
 /**
  * Tests for SkylarkImportLookupFunction.
  */
-public class SkylarkImportLookupFunctionTest extends BuildViewTestCase {
+@RunWith(JUnit4.class)
+public class SkylarkImportLookupFunctionTest extends BuildViewTestCaseForJunit4 {
 
-  @Override
-  public void setUp() throws Exception {
-    super.setUp();
+  @Before
+  public final void preparePackageLoading() throws Exception  {
     Path alternativeRoot = scratch.dir("/root_2");
     getSkyframeExecutor()
         .preparePackageLoading(
@@ -45,6 +54,7 @@
             UUID.randomUUID());
   }
 
+  @Test
   public void testSkylarkImportLabels() throws Exception {
     scratch.file("pkg1/BUILD");
     scratch.file("pkg1/ext.bzl");
@@ -59,12 +69,14 @@
     checkLabel("//dir/pkg3:dir/ext.bzl", "//dir/pkg3:dir/ext.bzl");
   }
 
+  @Test
   public void testSkylarkImportLabelsAlternativeRoot() throws Exception {
     scratch.file("/root_2/pkg4/BUILD");
     scratch.file("/root_2/pkg4/ext.bzl");
     checkLabel("//pkg4:ext.bzl", "//pkg4:ext.bzl");
   }
 
+  @Test
   public void testSkylarkImportLabelsMultipleBuildFiles() throws Exception {
     scratch.file("dir1/BUILD");
     scratch.file("dir1/dir2/BUILD");
@@ -72,6 +84,7 @@
     checkLabel("//dir1/dir2:ext.bzl", "//dir1/dir2:ext.bzl");
   }
 
+  @Test
   public void testLoadRelativePath() throws Exception {
     scratch.file("pkg/BUILD");
     scratch.file("pkg/ext1.bzl", "a = 1");
@@ -79,6 +92,7 @@
     get(key("//pkg:ext2.bzl"));
   }
 
+  @Test
   public void testLoadAbsolutePath() throws Exception {
     scratch.file("pkg2/BUILD");
     scratch.file("pkg3/BUILD");
@@ -87,6 +101,7 @@
     get(key("//pkg3:ext.bzl"));
   }
 
+  @Test
   public void testLoadFromSameAbsolutePathTwice() throws Exception {
     scratch.file("pkg1/BUILD");
     scratch.file("pkg2/BUILD");
@@ -95,6 +110,7 @@
     get(key("//pkg2:ext.bzl"));
   }
 
+  @Test
   public void testLoadFromSameRelativePathTwice() throws Exception {
     scratch.file("pkg/BUILD");
     scratch.file("pkg/ext1.bzl", "a = 1", "b = 2");
@@ -102,6 +118,7 @@
     get(key("//pkg:ext2.bzl"));
   }
 
+  @Test
   public void testLoadFromRelativePathInSubdir() throws Exception {
     scratch.file("pkg/BUILD");
     scratch.file("pkg/subdir/ext1.bzl", "a = 1");
@@ -131,6 +148,7 @@
         result.get(skylarkImportLookupKey).getDependency().getLabel().toString());
   }
 
+  @Test
   public void testSkylarkImportLookupNoBuildFile() throws Exception {
     scratch.file("pkg/ext.bzl", "");
     SkyKey skylarkImportLookupKey =
@@ -145,6 +163,7 @@
         + "BUILD file not found on package path", errorMessage);
   }
 
+  @Test
   public void testSkylarkImportLookupNoBuildFileForLoad() throws Exception {
     scratch.file("pkg2/BUILD");
     scratch.file("pkg1/ext.bzl", "a = 1");
@@ -161,6 +180,7 @@
         + "BUILD file not found on package path", errorMessage);
   }
 
+  @Test
   public void testSkylarkAbsoluteImportFilenameWithControlChars() throws Exception {
     scratch.file("pkg/BUILD", "");
     scratch.file("pkg/ext.bzl", "load('/pkg/oops\u0000', 'a')");
@@ -176,6 +196,7 @@
         + "target names may not contain non-printable characters: '\\x00'", errorMessage);
   }
 
+  @Test
   public void testSkylarkRelativeImportFilenameWithControlChars() throws Exception {
     scratch.file("pkg/BUILD", "");
     scratch.file("pkg/ext.bzl", "load('oops\u0000', 'a')");
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TargetMarkerFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/TargetMarkerFunctionTest.java
index 8ac667f..6a8fbccf 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TargetMarkerFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TargetMarkerFunctionTest.java
@@ -14,11 +14,13 @@
 package com.google.devtools.build.lib.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
-import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.analysis.util.BuildViewTestCaseForJunit4;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.packages.BuildFileNotFoundException;
@@ -35,6 +37,11 @@
 import com.google.devtools.build.skyframe.EvaluationResult;
 import com.google.devtools.build.skyframe.SkyKey;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.io.IOException;
 import java.util.Map;
 
@@ -43,14 +50,14 @@
  * TargetMarkerFunction as it uses PackageValues, and PackageFunction uses legacy stuff
  * that isn't easily mockable. So our testing strategy is to make hacky calls to SkyframeExecutor.
  */
-public class TargetMarkerFunctionTest extends BuildViewTestCase {
+@RunWith(JUnit4.class)
+public class TargetMarkerFunctionTest extends BuildViewTestCaseForJunit4 {
 
   private SkyframeExecutor skyframeExecutor;
   private CustomInMemoryFs fs = new CustomInMemoryFs();
 
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
+  @Before
+  public final void setSkyframExecutor() throws Exception  {
     skyframeExecutor = getSkyframeExecutor();
   }
 
@@ -78,6 +85,7 @@
   }
 
   /** Regression test for b/12545745 */
+  @Test
   public void testLabelCrossingSubpackageBoundary() throws Exception {
     scratch.file("a/b/c/foo.sh", "echo 'FOO'");
     scratch.file("a/BUILD", "sh_library(name = 'foo', srcs = ['b/c/foo.sh'])");
@@ -96,6 +104,7 @@
         .contains("Label '//a:b/c/foo.sh' crosses boundary of subpackage 'a/b'");
   }
 
+  @Test
   public void testNoBuildFileForTargetWithSlash() throws Exception {
     String labelName = "//no/such/package:target/withslash";
     BuildFileNotFoundException exn =
@@ -107,6 +116,7 @@
     assertThat(exn).hasMessage(expectedMessage);
   }
 
+  @Test
   public void testRuleWithError() throws Exception {
     reporter.removeHandler(failFastHandler);
     scratch.file(
@@ -121,6 +131,7 @@
     assertTrue(exn.hasTarget());
   }
 
+  @Test
   public void testTargetFunctionRethrowsExceptions() throws Exception {
     reporter.removeHandler(failFastHandler);
     scratch.file("a/BUILD", "sh_library(name = 'b/c')");
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderMediumTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderMediumTest.java
index 7ecc956..131d413 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderMediumTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderMediumTest.java
@@ -14,6 +14,9 @@
 package com.google.devtools.build.lib.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
@@ -28,6 +31,11 @@
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.UnixGlob;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.io.IOException;
 
 /**
@@ -35,13 +43,13 @@
  * separate class for now because they are a little slower.
  */
 @TestSpec(size = Suite.MEDIUM_TESTS)
+@RunWith(JUnit4.class)
 public class TimestampBuilderMediumTest extends TimestampBuilderTestCase {
   private Path cacheRoot;
   private CompactPersistentActionCache cache;
 
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
+  @Before
+  public final void setCache() throws Exception  {
     // BlazeRuntime.setupLogging(Level.FINEST);  // Uncomment this for debugging.
 
     cacheRoot = scratch.dir("cacheRoot");
@@ -63,6 +71,7 @@
   // - test timestamp monotonicity is not required (i.e. set mtime backwards)
   // - test change of key causes rebuild
 
+  @Test
   public void testUnneededInputs() throws Exception {
     Artifact hello = createSourceArtifact("hello");
     BlazeTestUtils.makeEmptyFile(hello.getPath());
@@ -109,6 +118,7 @@
     assertFalse(button.pressed); // not rebuilt
   }
 
+  @Test
   public void testPersistentCache_ModifyingInputCausesActionReexecution() throws Exception {
     // /hello -> [action] -> /goodbye
     Artifact hello = createSourceArtifact("hello");
@@ -140,6 +150,7 @@
     assertFalse(button.pressed); // not rebuilt
   }
 
+  @Test
   public void testModifyingInputCausesActionReexecution() throws Exception {
     // /hello -> [action] -> /goodbye
     Artifact hello = createSourceArtifact("hello");
@@ -176,6 +187,7 @@
     assertFalse(button.pressed); // not rebuilt
   }
 
+  @Test
   public void testArtifactOrderingDoesNotMatter() throws Exception {
     // (/hello,/there) -> [action] -> /goodbye
 
@@ -209,6 +221,7 @@
     assertFalse(button2.pressed); // still not rebuilt
   }
 
+  @Test
   public void testOldCacheKeysAreCleanedUp() throws Exception {
     // [action1] -> (/goodbye), cache key will be /goodbye
     Artifact goodbye = createDerivedArtifact("goodbye");
@@ -241,6 +254,7 @@
     assertThat(cache.get(goodbye.getExecPathString())).isNull();
   }
 
+  @Test
   public void testArtifactNamesMatter() throws Exception {
     // /hello -> [action] -> /goodbye
 
@@ -271,6 +285,7 @@
     assertTrue(button2.pressed); // name changed. must rebuild.
   }
 
+  @Test
   public void testDuplicateInputs() throws Exception {
     // (/hello,/hello) -> [action] -> /goodbye
 
@@ -310,6 +325,7 @@
    * does not cause action reexecution when metadata cache uses file digests in
    * addition to the timestamp.
    */
+  @Test
   public void testModifyingTimestampOnlyDoesNotCauseActionReexecution() throws Exception {
     // /hello -> [action] -> /goodbye
     Artifact hello = createSourceArtifact("hello");
@@ -334,6 +350,7 @@
     assertFalse(button.pressed); // not rebuilt
   }
 
+  @Test
   public void testPersistentCache_ModifyingOutputCausesActionReexecution() throws Exception {
     // [action] -> /hello
     Artifact hello = createDerivedArtifact("hello");
@@ -363,6 +380,7 @@
     assertFalse(button.pressed); // not rebuilt
   }
 
+  @Test
   public void testPersistentCache_missingFilenameIndexCausesActionReexecution() throws Exception {
     // [action] -> /hello
     Artifact hello = createDerivedArtifact("hello");
@@ -408,6 +426,7 @@
     assertTrue(button.pressed); // rebuilt due to the missing filename index
   }
 
+  @Test
   public void testPersistentCache_failedIntegrityCheckCausesActionReexecution() throws Exception {
     // [action] -> /hello
     Artifact hello = createDerivedArtifact("hello");
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTest.java
index 5359fe9..55f1784 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTest.java
@@ -15,6 +15,9 @@
 package com.google.devtools.build.lib.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.Sets;
@@ -24,6 +27,10 @@
 import com.google.devtools.build.lib.testutil.BlazeTestUtils;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.util.Collection;
 import java.util.Collections;
 
@@ -31,8 +38,10 @@
  * Test suite for TimestampBuilder.
  *
  */
+@RunWith(JUnit4.class)
 public class TimestampBuilderTest extends TimestampBuilderTestCase {
 
+  @Test
   public void testAmnesiacBuilderAlwaysRebuilds() throws Exception {
     // [action] -> hello
     Artifact hello = createDerivedArtifact("hello");
@@ -54,6 +63,7 @@
   // That is, Builders conflate traversal and dependency analysis, and don't
   // revisit a node (traversal) even if it needs to be rebuilt (dependency
   // analysis).  We might want to separate these aspects.
+  @Test
   public void testBuilderDoesntRevisitActions() throws Exception {
     // [action] -> hello
     Artifact hello = createDerivedArtifact("hello");
@@ -66,12 +76,14 @@
     assertEquals(counter.count, 1); // built only once
   }
 
+  @Test
   public void testBuildingExistingSourcefileSuceeds() throws Exception {
     Artifact hello = createSourceArtifact("hello");
     BlazeTestUtils.makeEmptyFile(hello.getPath());
     buildArtifacts(cachingBuilder(), hello);
   }
 
+  @Test
   public void testBuildingNonexistentSourcefileFails() throws Exception {
     reporter.removeHandler(failFastHandler);
     Artifact hello = createSourceArtifact("hello");
@@ -83,6 +95,7 @@
     }
   }
 
+  @Test
   public void testCachingBuilderCachesUntilReset() throws Exception {
     // [action] -> hello
     Artifact hello = createDerivedArtifact("hello");
@@ -103,6 +116,7 @@
     assertTrue(button.pressed); // rebuilt
   }
 
+  @Test
   public void testUnneededInputs() throws Exception {
     Artifact hello = createSourceArtifact("hello");
     BlazeTestUtils.makeEmptyFile(hello.getPath());
@@ -139,6 +153,7 @@
     assertFalse(button.pressed); // not rebuilt
   }
 
+  @Test
   public void testModifyingInputCausesActionReexecution() throws Exception {
     // hello -> [action] -> goodbye
     Artifact hello = createSourceArtifact("hello");
@@ -166,6 +181,7 @@
     assertFalse(button.pressed); // not rebuilt
   }
 
+  @Test
   public void testOnlyModifyingInputContentCausesReexecution() throws Exception {
     // hello -> [action] -> goodbye
     Artifact hello = createSourceArtifact("hello");
@@ -201,6 +217,7 @@
     assertFalse(button.pressed); // not rebuilt
   }
 
+  @Test
   public void testModifyingOutputCausesActionReexecution() throws Exception {
     // [action] -> hello
     Artifact hello = createDerivedArtifact("hello");
@@ -228,6 +245,7 @@
     assertFalse(button.pressed); // not rebuilt
   }
 
+  @Test
   public void testBuildingTransitivePrerequisites() throws Exception {
     // hello -> [action1] -> wazuup -> [action2] -> goodbye
     Artifact hello = createSourceArtifact("hello");
@@ -265,6 +283,7 @@
     assertTrue(button2.pressed); // goodbye rebuilt
   }
 
+  @Test
   public void testWillNotRebuildActionsWithEmptyListOfInputsSpuriously()
       throws Exception {
 
@@ -289,6 +308,7 @@
     assertFalse(anotherButton.pressed);
   }
 
+  @Test
   public void testMissingSourceFileIsAnError() throws Exception {
     // A missing input to an action must be treated as an error because there's
     // a risk that the action that consumes it will succeed, but with a
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
index 5c52a90..ef8fc99 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
@@ -43,7 +43,7 @@
 import com.google.devtools.build.lib.events.Reporter;
 import com.google.devtools.build.lib.events.StoredEventHandler;
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
-import com.google.devtools.build.lib.testutil.FoundationTestCase;
+import com.google.devtools.build.lib.testutil.FoundationTestCaseForJunit4;
 import com.google.devtools.build.lib.testutil.TestUtils;
 import com.google.devtools.build.lib.util.AbruptExitException;
 import com.google.devtools.build.lib.util.BlazeClock;
@@ -63,6 +63,8 @@
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
 
+import org.junit.Before;
+
 import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -80,7 +82,7 @@
 /**
  * The common code that's shared between various builder tests.
  */
-public abstract class TimestampBuilderTestCase extends FoundationTestCase {
+public abstract class TimestampBuilderTestCase extends FoundationTestCaseForJunit4 {
 
   private static final SkyKey OWNER_KEY = new SkyKey(SkyFunctions.ACTION_LOOKUP, "OWNER");
   protected static final ActionLookupValue.ActionLookupKey ALL_OWNER =
@@ -95,9 +97,8 @@
 
   protected AtomicReference<EventBus> eventBusRef = new AtomicReference<>();
 
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
+  @Before
+  public final void initialize() throws Exception  {
     inMemoryCache = new InMemoryActionCache();
     tsgm = new TimestampGranularityMonitor(clock);
     ResourceManager.instance().setAvailableResources(ResourceSet.createWithRamCpuIo(100, 1, 1));
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java
index da7eadc..66630c8 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java
@@ -14,8 +14,12 @@
 
 package com.google.devtools.build.lib.skyframe;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
-import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.analysis.util.BuildViewTestCaseForJunit4;
 import com.google.devtools.build.lib.bazel.rules.BazelRulesModule;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.NoSuchTargetException;
@@ -30,6 +34,10 @@
 import com.google.devtools.build.skyframe.SkyFunction;
 import com.google.devtools.build.skyframe.SkyKey;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 import org.mockito.Matchers;
 import org.mockito.Mockito;
 
@@ -38,7 +46,8 @@
 /**
  * Test for {@link WorkspaceFileFunction}.
  */
-public class WorkspaceFileFunctionTest extends BuildViewTestCase {
+@RunWith(JUnit4.class)
+public class WorkspaceFileFunctionTest extends BuildViewTestCaseForJunit4 {
 
   private WorkspaceFileFunction skyFunc;
   private FakeFileValue fakeWorkspaceFileValue;
@@ -82,9 +91,8 @@
     }
   }
 
-  @Override
-  public void setUp() throws Exception {
-    super.setUp();
+  @Before
+  public final void setUp() throws Exception {
     ConfiguredRuleClassProvider ruleClassProvider = TestRuleClassProvider.getRuleClassProvider();
     skyFunc =
         new WorkspaceFileFunction(
@@ -113,6 +121,7 @@
     return env;
   }
 
+  @Test
   public void testInvalidRepo() throws Exception {
     RootedPath workspacePath = createWorkspaceFile("workspace(name = 'foo$')");
     PackageValue value =
@@ -122,6 +131,7 @@
     MoreAsserts.assertContainsEvent(pkg.getEvents(), "target names may not contain '$'");
   }
 
+  @Test
   public void testBindFunction() throws Exception {
     String lines[] = {"bind(name = 'foo/bar',", "actual = '//foo:bar')"};
     RootedPath workspacePath = createWorkspaceFile(lines);
@@ -133,6 +143,7 @@
     MoreAsserts.assertNoEvents(pkg.getEvents());
   }
 
+  @Test
   public void testBindArgsReversed() throws Exception {
     String lines[] = {"bind(actual = '//foo:bar', name = 'foo/bar')"};
     RootedPath workspacePath = createWorkspaceFile(lines);
@@ -144,6 +155,7 @@
     MoreAsserts.assertNoEvents(pkg.getEvents());
   }
 
+  @Test
   public void testNonExternalBinding() throws Exception {
     // name must be a valid label name.
     String lines[] = {"bind(name = 'foo:bar', actual = '//bar/baz')"};
@@ -156,6 +168,7 @@
     MoreAsserts.assertContainsEvent(pkg.getEvents(), "target names may not contain ':'");
   }
 
+  @Test
   public void testWorkspaceFileParsingError() throws Exception {
     // //external:bar:baz is not a legal package.
     String lines[] = {"bind(name = 'foo/bar', actual = '//external:bar:baz')"};
@@ -168,6 +181,7 @@
     MoreAsserts.assertContainsEvent(pkg.getEvents(), "target names may not contain ':'");
   }
 
+  @Test
   public void testNoWorkspaceFile() throws Exception {
     // Even though the WORKSPACE exists, Skyframe thinks it doesn't, so it doesn't.
     String lines[] = {"bind(name = 'foo/bar', actual = '//foo:bar')"};
@@ -181,6 +195,7 @@
     MoreAsserts.assertNoEvents(pkg.getEvents());
   }
 
+  @Test
   public void testListBindFunction() throws Exception {
     String lines[] = {
         "L = ['foo', 'bar']", "bind(name = '%s/%s' % (L[0], L[1]),", "actual = '//foo:bar')"};