diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelDesugaredLibraryReferenceTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelDesugaredLibraryReferenceTest.java
index c3c1940..0d451cb 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelDesugaredLibraryReferenceTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelDesugaredLibraryReferenceTest.java
@@ -65,7 +65,10 @@
             shrinkDesugaredLibrary)
         .run(parameters.getRuntime(), Executor.class)
         .assertSuccessWithOutputLines("Z")
-        .inspect(ApiModelingTestHelper.verifyThat(parameters, printZone).inlinedInto(main));
+        .inspect(
+            inspector ->
+                ApiModelingTestHelper.verifyThat(inspector, parameters, printZone)
+                    .inlinedInto(main));
   }
 
   static class Executor {
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineInSameClassDifferentApiLevelTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineInSameClassDifferentApiLevelTest.java
index 8002d8c..911731b 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineInSameClassDifferentApiLevelTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineInSameClassDifferentApiLevelTest.java
@@ -47,7 +47,7 @@
         .apply(ApiModelingTestHelper::enableApiCallerIdentification)
         .enableInliningAnnotations()
         .compile()
-        .inspect(verifyThat(parameters, callApi).inlinedInto(callCallApi))
+        .inspect(inspector -> verifyThat(inspector, parameters, callApi).inlinedInto(callCallApi))
         .addRunClasspathClasses(Api.class)
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("Api::apiLevel22");
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineInSameClassTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineInSameClassTest.java
index 1ccb626..8d4e2f1 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineInSameClassTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineInSameClassTest.java
@@ -53,10 +53,10 @@
         .apply(setMockApiLevelForMethod(apiMethod, AndroidApiLevel.L_MR1))
         .apply(ApiModelingTestHelper::enableApiCallerIdentification)
         .compile()
-        .inspect(verifyThat(parameters, notCallingApi).inlinedIntoFromApiLevel(main, L_MR1))
         .inspect(
             inspector -> {
               // No matter the api level, we should always inline callingApi into notCallingApi.
+              verifyThat(inspector, parameters, notCallingApi).inlinedIntoFromApiLevel(main, L_MR1);
               assertThat(inspector.method(callingApi), not(isPresent()));
               if (parameters.isDexRuntime()
                   && parameters.getApiLevel().isGreaterThanOrEqualTo(L_MR1)) {
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineMethodWithApiTypeTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineMethodWithApiTypeTest.java
index 03b2f3e..9d667c1 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineMethodWithApiTypeTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineMethodWithApiTypeTest.java
@@ -52,8 +52,12 @@
         .addRunClasspathClasses(ApiType.class)
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines(ApiType.class.getName())
-        .inspect(verifyThat(parameters, apiCallerApiLevel22).inlinedInto(apiCallerCallerApiLevel22))
-        .inspect(inspector -> assertThat(inspector.clazz(OtherCaller.class), not(isPresent())));
+        .inspect(
+            inspector -> {
+              verifyThat(inspector, parameters, apiCallerApiLevel22)
+                  .inlinedInto(apiCallerCallerApiLevel22);
+              assertThat(inspector.clazz(OtherCaller.class), not(isPresent()));
+            });
   }
 
   public static class ApiType {}
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassInstanceInitTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassInstanceInitTest.java
index 153759b..7c60172 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassInstanceInitTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassInstanceInitTest.java
@@ -58,7 +58,9 @@
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLinesIf(isMockApiLevel, "LibraryClass::foo")
         .assertSuccessWithOutputLinesIf(!isMockApiLevel, "NoClassDefFoundError")
-        .inspect(verifyThat(parameters, LibraryClass.class).stubbedUntil(mockLevel))
+        .inspect(
+            inspector ->
+                verifyThat(inspector, parameters, LibraryClass.class).stubbedUntil(mockLevel))
         .applyIf(
             !isMockApiLevel
                 && parameters.isDexRuntime()
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassTest.java
index 3c5ad21..dddfcbc 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassTest.java
@@ -60,7 +60,9 @@
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLinesIf(isMockApiLevel, "LibraryClass::foo")
         .assertSuccessWithOutputLinesIf(!isMockApiLevel, "Hello World")
-        .inspect(verifyThat(parameters, LibraryClass.class).stubbedUntil(mockLevel));
+        .inspect(
+            inspector ->
+                verifyThat(inspector, parameters, LibraryClass.class).stubbedUntil(mockLevel));
   }
 
   // Only present from api level 23.
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockInheritedClassTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockInheritedClassTest.java
index 2268036..474874c 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockInheritedClassTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockInheritedClassTest.java
@@ -59,7 +59,9 @@
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLinesIf(isMockApiLevel, "ProgramClass::foo")
         .assertSuccessWithOutputLinesIf(!isMockApiLevel, "Hello World")
-        .inspect(verifyThat(parameters, LibraryClass.class).stubbedUntil(mockLevel));
+        .inspect(
+            inspector ->
+                verifyThat(inspector, parameters, LibraryClass.class).stubbedUntil(mockLevel));
   }
 
   // Only present from api level 23.
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockSuperChainClassTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockSuperChainClassTest.java
index a5f30c2..6c8b93d 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockSuperChainClassTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockSuperChainClassTest.java
@@ -73,9 +73,13 @@
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLinesIf(isMockApiLevel, "ProgramClass::foo")
         .assertSuccessWithOutputLinesIf(!isMockApiLevel, "Hello World")
-        .inspect(verifyThat(parameters, LibraryClass.class).stubbedUntil(lowerMockApiLevel))
-        .inspect(verifyThat(parameters, LibraryInterface.class).stubbedUntil(lowerMockApiLevel))
-        .inspect(verifyThat(parameters, OtherLibraryClass.class).stubbedUntil(mockApiLevel));
+        .inspect(
+            inspector -> {
+              verifyThat(inspector, parameters, LibraryClass.class).stubbedUntil(lowerMockApiLevel);
+              verifyThat(inspector, parameters, LibraryInterface.class)
+                  .stubbedUntil(lowerMockApiLevel);
+              verifyThat(inspector, parameters, OtherLibraryClass.class).stubbedUntil(mockApiLevel);
+            });
   }
 
   // Only present from api level 23.
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoDesugaredLibraryReferenceTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoDesugaredLibraryReferenceTest.java
index e752764..45d2bec 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoDesugaredLibraryReferenceTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoDesugaredLibraryReferenceTest.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.apimodel;
 
+import static com.android.tools.r8.apimodel.ApiModelingTestHelper.verifyThat;
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.TestParameters;
@@ -68,8 +69,10 @@
             parameters.getDexRuntimeVersion().isNewerThan(Version.V7_0_0),
             result -> result.assertSuccessWithOutputLines("~"))
         .inspect(
-            ApiModelingTestHelper.verifyThat(parameters, printZone)
-                .inlinedIntoFromApiLevel(main, AndroidApiLevel.O));
+            inspector -> {
+              verifyThat(inspector, parameters, printZone)
+                  .inlinedIntoFromApiLevel(main, AndroidApiLevel.O);
+            });
   }
 
   static class Executor {
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelInstanceFieldTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelInstanceFieldTest.java
index 9446479..ecbd92e 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelInstanceFieldTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelInstanceFieldTest.java
@@ -54,7 +54,10 @@
         .apply(setMockApiLevelForDefaultInstanceInitializer(Api.class, L_MR1))
         .apply(ApiModelingTestHelper::enableApiCallerIdentification)
         .compile()
-        .inspect(verifyThat(parameters, apiCaller).inlinedIntoFromApiLevel(apiCallerCaller, L_MR1))
+        .inspect(
+            inspector ->
+                verifyThat(inspector, parameters, apiCaller)
+                    .inlinedIntoFromApiLevel(apiCallerCaller, L_MR1))
         .addRunClasspathClasses(Api.class)
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("Hello World!");
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelInterfaceTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelInterfaceTest.java
index a480188..d39b038 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelInterfaceTest.java
@@ -53,8 +53,9 @@
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("A::noApiCall", "ApiCaller::callInterfaceMethod")
         .inspect(
-            verifyThat(parameters, apiCaller)
-                .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.L_MR1));
+            inspector ->
+                verifyThat(inspector, parameters, apiCaller)
+                    .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.L_MR1));
   }
 
   public interface Api {
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelIntoLowerDirectTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelIntoLowerDirectTest.java
index e79cfed..98aa240 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelIntoLowerDirectTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelIntoLowerDirectTest.java
@@ -48,7 +48,8 @@
         .apply(ApiModelingTestHelper::enableApiCallerIdentification)
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("A::apiLevel21", "B::apiLevel22")
-        .inspect(verifyThat(parameters, apiLevel22).inlinedInto(apiLevel21));
+        .inspect(
+            inspector -> verifyThat(inspector, parameters, apiLevel22).inlinedInto(apiLevel21));
   }
 
   // This tests that program classes where we directly mock the methods to have an api level will
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelStaticFieldTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelStaticFieldTest.java
index 28a2b00..f4465a4 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelStaticFieldTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelStaticFieldTest.java
@@ -51,8 +51,9 @@
         .apply(ApiModelingTestHelper::enableApiCallerIdentification)
         .compile()
         .inspect(
-            verifyThat(parameters, apiCaller)
-                .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.L_MR1))
+            inspector ->
+                verifyThat(inspector, parameters, apiCaller)
+                    .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.L_MR1))
         .addRunClasspathClasses(Api.class)
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("Hello World!");
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelStaticTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelStaticTest.java
index b5c7134..16f24fa 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelStaticTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelStaticTest.java
@@ -50,8 +50,9 @@
         .apply(ApiModelingTestHelper::enableApiCallerIdentification)
         .compile()
         .inspect(
-            verifyThat(parameters, apiCaller)
-                .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.L_MR1))
+            inspector ->
+                verifyThat(inspector, parameters, apiCaller)
+                    .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.L_MR1))
         .addRunClasspathClasses(Api.class)
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines(
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelSuperTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelSuperTest.java
index e1cf2e2..4979620 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelSuperTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelSuperTest.java
@@ -68,7 +68,9 @@
                 }))
         .compile()
         // We do not inline overrides calling super.
-        .inspect(verifyThat(parameters, apiCaller).notInlinedInto(apiCallerCaller))
+        .inspect(
+            inspector ->
+                verifyThat(inspector, parameters, apiCaller).notInlinedInto(apiCallerCaller))
         .addRunClasspathClasses(Api.class)
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("A::noApiCall", "ApiCaller::apiLevel22", "Api::apiLevel22");
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelVirtualTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelVirtualTest.java
index a366d8a..2311f12 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelVirtualTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelVirtualTest.java
@@ -55,8 +55,9 @@
         .apply(ApiModelingTestHelper::enableApiCallerIdentification)
         .compile()
         .inspect(
-            verifyThat(parameters, apiCaller)
-                .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.L_MR1))
+            inspector ->
+                verifyThat(inspector, parameters, apiCaller)
+                    .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.L_MR1))
         .addRunClasspathClasses(Api.class)
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines(
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfStaticInterfaceMethodsTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfStaticInterfaceMethodsTest.java
index 086cfa4..498ef4c 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfStaticInterfaceMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfStaticInterfaceMethodsTest.java
@@ -64,16 +64,17 @@
                 ClassSubject companion = inspector.companionClassFor(ApiCaller.class);
                 assertThat(companion, isPresent());
                 FoundClassSubject foundCompanion = companion.asFoundClassSubject();
-                verifyThat(parameters, callApiLevel22)
+                verifyThat(inspector, parameters, callApiLevel22)
                     .setHolder(foundCompanion)
                     .inlinedIntoFromApiLevel(noApiCallTo22, L_MR1);
-                verifyThat(parameters, callApiLevel26)
+                verifyThat(inspector, parameters, callApiLevel26)
                     .setHolder(foundCompanion)
                     .inlinedIntoFromApiLevel(noApiCallTo26, O);
               } else {
-                verifyThat(parameters, callApiLevel22)
+                verifyThat(inspector, parameters, callApiLevel22)
                     .inlinedIntoFromApiLevel(noApiCallTo22, L_MR1);
-                verifyThat(parameters, callApiLevel26).inlinedIntoFromApiLevel(noApiCallTo26, O);
+                verifyThat(inspector, parameters, callApiLevel26)
+                    .inlinedIntoFromApiLevel(noApiCallTo26, O);
               }
             })
         .addRunClasspathClasses(Api.class)
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineDuplicateMethodTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineDuplicateMethodTest.java
index e0afd34..0760cad 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineDuplicateMethodTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineDuplicateMethodTest.java
@@ -86,7 +86,8 @@
                       : 3;
               assertEquals(classCount, inspector.allClasses().size());
               Method testMethod = TestClass.class.getDeclaredMethod("test");
-              verifyThat(parameters, adeddOn23).isOutlinedFromUntil(testMethod, methodApiLevel);
+              verifyThat(inspector, parameters, adeddOn23)
+                  .isOutlinedFromUntil(testMethod, methodApiLevel);
               if (parameters.isDexRuntime()
                   && parameters.getApiLevel().isLessThan(methodApiLevel)) {
                 // Verify that we invoke the synthesized outline addedOn23 twice.
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodAndStubClassTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodAndStubClassTest.java
index 051f793..a3e2d46 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodAndStubClassTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodAndStubClassTest.java
@@ -69,11 +69,13 @@
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLinesIf(libraryClassNotStubbed, "LibraryClass::foo")
         .assertSuccessWithOutputLinesIf(!libraryClassNotStubbed, "Hello World")
-        .inspect(verifyThat(parameters, LibraryClass.class).stubbedUntil(libraryClassLevel))
         .inspect(
-            verifyThat(parameters, apiMethod)
-                .isOutlinedFromUntil(
-                    Main.class.getDeclaredMethod("main", String[].class), libraryMethodLevel));
+            inspector -> {
+              verifyThat(inspector, parameters, LibraryClass.class).stubbedUntil(libraryClassLevel);
+              verifyThat(inspector, parameters, apiMethod)
+                  .isOutlinedFromUntil(
+                      Main.class.getDeclaredMethod("main", String[].class), libraryMethodLevel);
+            });
   }
 
   // Only present from api level 23.
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodMissingClassTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodMissingClassTest.java
index 9d0f7cf..b41ee4c 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodMissingClassTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodMissingClassTest.java
@@ -113,10 +113,14 @@
                                       .matches(methodSubject))
                       .findFirst();
               assertFalse(synthesizedMissingNotReferenced.isPresent());
-              verifyThat(parameters, addedOn23).isOutlinedFromUntil(testMethod, AndroidApiLevel.M);
-              verifyThat(parameters, addedOn27)
+              verifyThat(inspector, parameters, addedOn23)
+                  .isOutlinedFromUntil(testMethod, AndroidApiLevel.M);
+              verifyThat(inspector, parameters, addedOn27)
                   .isOutlinedFromUntil(testMethod, AndroidApiLevel.O_MR1);
-              verifyThat(parameters, LibraryClass.class.getDeclaredMethod("missingAndReferenced"))
+              verifyThat(
+                      inspector,
+                      parameters,
+                      LibraryClass.class.getDeclaredMethod("missingAndReferenced"))
                   .isOutlinedFrom(testMethod);
               if (parameters.getApiLevel().isLessThan(AndroidApiLevel.O_MR1)) {
                 assertEquals(5, inspector.allClasses().size());
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineNoMockingTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineNoMockingTest.java
index 9638a31..69a7a97 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineNoMockingTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineNoMockingTest.java
@@ -73,8 +73,10 @@
             inspector -> {
               Method mainMethod = Main.class.getDeclaredMethod("main", String[].class);
               assertThat(inspector.method(mainMethod), isPresent());
-              verifyThat(parameters, getterOn23).isOutlinedFromUntil(mainMethod, libraryApiLevel);
-              verifyThat(parameters, methodOn23).isOutlinedFromUntil(mainMethod, libraryApiLevel);
+              verifyThat(inspector, parameters, getterOn23)
+                  .isOutlinedFromUntil(mainMethod, libraryApiLevel);
+              verifyThat(inspector, parameters, methodOn23)
+                  .isOutlinedFromUntil(mainMethod, libraryApiLevel);
               assertThat(inspector.clazz(LibraryClass.class), isAbsent());
             });
   }
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelTypeReferenceInvokeTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelTypeReferenceInvokeTest.java
index ef4737d..25f0c3a 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelTypeReferenceInvokeTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelTypeReferenceInvokeTest.java
@@ -52,8 +52,9 @@
         .addAndroidBuildVersion()
         .compile()
         .inspect(
-            verifyThat(parameters, apiCaller)
-                .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.M))
+            inspector ->
+                verifyThat(inspector, parameters, apiCaller)
+                    .inlinedIntoFromApiLevel(apiCallerCaller, AndroidApiLevel.M))
         .addRunClasspathClasses(LibraryClass.class)
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLinesIf(
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelingTestHelper.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelingTestHelper.java
index 70d4f36..7077a21 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelingTestHelper.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelingTestHelper.java
@@ -19,7 +19,6 @@
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.ThrowingConsumer;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.CodeMatchers;
 import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
@@ -150,49 +149,56 @@
     };
   }
 
-  static ApiModelingClassVerificationHelper verifyThat(TestParameters parameters, Class<?> clazz) {
-    return new ApiModelingClassVerificationHelper(parameters, clazz);
+  static ApiModelingClassVerificationHelper verifyThat(
+      CodeInspector inspector, TestParameters parameters, Class<?> clazz) {
+    return new ApiModelingClassVerificationHelper(inspector, parameters, clazz);
   }
 
-  static ApiModelingMethodVerificationHelper verifyThat(TestParameters parameters, Method method) {
-    return new ApiModelingMethodVerificationHelper(parameters, Reference.methodFromMethod(method));
+  static ApiModelingMethodVerificationHelper verifyThat(
+      CodeInspector inspector, TestParameters parameters, Method method) {
+    return new ApiModelingMethodVerificationHelper(
+        inspector, parameters, Reference.methodFromMethod(method));
   }
 
   public static class ApiModelingClassVerificationHelper {
 
+    private final CodeInspector inspector;
     private final Class<?> classOfInterest;
     private final TestParameters parameters;
 
-    public ApiModelingClassVerificationHelper(TestParameters parameters, Class<?> classOfInterest) {
+    public ApiModelingClassVerificationHelper(
+        CodeInspector inspector, TestParameters parameters, Class<?> classOfInterest) {
+      this.inspector = inspector;
       this.parameters = parameters;
       this.classOfInterest = classOfInterest;
     }
 
-    public ThrowingConsumer<CodeInspector, Exception> stubbedUntil(AndroidApiLevel finalApiLevel) {
-      return inspector -> {
-        assertThat(
-            inspector.clazz(classOfInterest),
-            notIf(
-                isPresent(),
-                parameters.isCfRuntime()
-                    || parameters.getApiLevel().isGreaterThanOrEqualTo(finalApiLevel)));
-      };
+    public void stubbedUntil(AndroidApiLevel finalApiLevel) {
+      assertThat(
+          inspector.clazz(classOfInterest),
+          notIf(
+              isPresent(),
+              parameters.isCfRuntime()
+                  || parameters.getApiLevel().isGreaterThanOrEqualTo(finalApiLevel)));
     }
   }
 
   public static class ApiModelingMethodVerificationHelper {
 
+    private final CodeInspector inspector;
     private final MethodReference methodOfInterest;
     private final TestParameters parameters;
 
     private ApiModelingMethodVerificationHelper(
-        TestParameters parameters, MethodReference methodOfInterest) {
+        CodeInspector inspector, TestParameters parameters, MethodReference methodOfInterest) {
+      this.inspector = inspector;
       this.methodOfInterest = methodOfInterest;
       this.parameters = parameters;
     }
 
     public ApiModelingMethodVerificationHelper setHolder(FoundClassSubject classSubject) {
       return new ApiModelingMethodVerificationHelper(
+          inspector,
           parameters,
           Reference.method(
               classSubject.getFinalReference(),
@@ -201,68 +207,62 @@
               methodOfInterest.getReturnType()));
     }
 
-    ThrowingConsumer<CodeInspector, Exception> inlinedIntoFromApiLevel(
-        Method method, AndroidApiLevel apiLevel) {
-      return parameters.isDexRuntime() && parameters.getApiLevel().isGreaterThanOrEqualTo(apiLevel)
-          ? inlinedInto(method)
-          : notInlinedInto(method);
+    void inlinedIntoFromApiLevel(Method method, AndroidApiLevel apiLevel) {
+      if (parameters.isDexRuntime() && parameters.getApiLevel().isGreaterThanOrEqualTo(apiLevel)) {
+        inlinedInto(method);
+      } else {
+        notInlinedInto(method);
+      }
     }
 
-    ThrowingConsumer<CodeInspector, Exception> notInlinedInto(Method method) {
-      return inspector -> {
-        MethodSubject candidate = inspector.method(methodOfInterest);
-        assertThat(candidate, isPresent());
-        MethodSubject target = inspector.method(method);
-        assertThat(target, isPresent());
-        assertThat(target, CodeMatchers.invokesMethod(candidate));
-      };
+    void notInlinedInto(Method method) {
+      MethodSubject candidate = inspector.method(methodOfInterest);
+      assertThat(candidate, isPresent());
+      MethodSubject target = inspector.method(method);
+      assertThat(target, isPresent());
+      assertThat(target, CodeMatchers.invokesMethod(candidate));
     }
 
-    ThrowingConsumer<CodeInspector, Exception> inlinedInto(Method method) {
-      return inspector -> {
-        MethodSubject candidate = inspector.method(methodOfInterest);
-        if (!candidate.isPresent()) {
-          return;
-        }
-        MethodSubject target = inspector.method(method);
-        assertThat(target, isPresent());
-        assertThat(target, not(CodeMatchers.invokesMethod(candidate)));
-      };
+    void inlinedInto(Method method) {
+      MethodSubject candidate = inspector.method(methodOfInterest);
+      if (!candidate.isPresent()) {
+        return;
+      }
+      MethodSubject target = inspector.method(method);
+      assertThat(target, isPresent());
+      assertThat(target, not(CodeMatchers.invokesMethod(candidate)));
     }
 
-    ThrowingConsumer<CodeInspector, Exception> isOutlinedFromUntil(
-        Method method, AndroidApiLevel apiLevel) {
-      return parameters.isDexRuntime() && parameters.getApiLevel().isLessThan(apiLevel)
-          ? isOutlinedFrom(method)
-          : isNotOutlinedFrom(method);
+    void isOutlinedFromUntil(Method method, AndroidApiLevel apiLevel) {
+      if (parameters.isDexRuntime() && parameters.getApiLevel().isLessThan(apiLevel)) {
+        isOutlinedFrom(method);
+      } else {
+        isNotOutlinedFrom(method);
+      }
     }
 
-    ThrowingConsumer<CodeInspector, Exception> isOutlinedFrom(Method method) {
-      return inspector -> {
-        // Check that the call is in a synthetic class.
-        List<FoundMethodSubject> outlinedMethod =
-            inspector.allClasses().stream()
-                .flatMap(clazz -> clazz.allMethods().stream())
-                .filter(
-                    methodSubject ->
-                        methodSubject.isSynthetic()
-                            && invokesMethodWithName(methodOfInterest.getMethodName())
-                                .matches(methodSubject))
-                .collect(Collectors.toList());
-        assertEquals(1, outlinedMethod.size());
-        // Assert that method invokes the outline
-        MethodSubject caller = inspector.method(method);
-        assertThat(caller, isPresent());
-        assertThat(caller, invokesMethod(outlinedMethod.get(0)));
-      };
+    void isOutlinedFrom(Method method) {
+      // Check that the call is in a synthetic class.
+      List<FoundMethodSubject> outlinedMethod =
+          inspector.allClasses().stream()
+              .flatMap(clazz -> clazz.allMethods().stream())
+              .filter(
+                  methodSubject ->
+                      methodSubject.isSynthetic()
+                          && invokesMethodWithName(methodOfInterest.getMethodName())
+                              .matches(methodSubject))
+              .collect(Collectors.toList());
+      assertEquals(1, outlinedMethod.size());
+      // Assert that method invokes the outline
+      MethodSubject caller = inspector.method(method);
+      assertThat(caller, isPresent());
+      assertThat(caller, invokesMethod(outlinedMethod.get(0)));
     }
 
-    ThrowingConsumer<CodeInspector, Exception> isNotOutlinedFrom(Method method) {
-      return inspector -> {
-        MethodSubject caller = inspector.method(method);
-        assertThat(caller, isPresent());
-        assertThat(caller, invokesMethodWithName(methodOfInterest.getMethodName()));
-      };
+    void isNotOutlinedFrom(Method method) {
+      MethodSubject caller = inspector.method(method);
+      assertThat(caller, isPresent());
+      assertThat(caller, invokesMethodWithName(methodOfInterest.getMethodName()));
     }
   }
 }
