diff --git a/src/test/java/com/google/devtools/build/android/desugar/nest/BUILD b/src/test/java/com/google/devtools/build/android/desugar/nest/BUILD
index 442fae3..ea3920d 100644
--- a/src/test/java/com/google/devtools/build/android/desugar/nest/BUILD
+++ b/src/test/java/com/google/devtools/build/android/desugar/nest/BUILD
@@ -177,6 +177,7 @@
     ],
     test_class = "com.google.devtools.build.android.desugar.nest.NestDesugaringMethodAccessTest",
     deps = [
+        "//src/tools/android/java/com/google/devtools/build/android/desugar/langmodel",
         "//src/tools/android/java/com/google/devtools/build/android/desugar/testing/junit:desugar_rule",
         "//third_party:asm",
         "//third_party:asm-tree",
diff --git a/src/test/java/com/google/devtools/build/android/desugar/nest/NestDesugaringCoreLibTest.java b/src/test/java/com/google/devtools/build/android/desugar/nest/NestDesugaringCoreLibTest.java
index fbd3b5e..d101978 100644
--- a/src/test/java/com/google/devtools/build/android/desugar/nest/NestDesugaringCoreLibTest.java
+++ b/src/test/java/com/google/devtools/build/android/desugar/nest/NestDesugaringCoreLibTest.java
@@ -17,8 +17,8 @@
 package com.google.devtools.build.android.desugar.nest;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.devtools.build.android.desugar.testing.junit.DesugarTestHelpers.getRuntimePathsFromJvmFlag;
 
-import com.google.common.base.Splitter;
 import com.google.devtools.build.android.desugar.testing.junit.AsmNode;
 import com.google.devtools.build.android.desugar.testing.junit.DesugarRule;
 import com.google.devtools.build.android.desugar.testing.junit.DesugarRunner;
@@ -28,8 +28,6 @@
 import java.lang.invoke.MethodHandle;
 import java.lang.invoke.MethodHandles;
 import java.lang.invoke.MethodHandles.Lookup;
-import java.nio.file.Path;
-import java.nio.file.Paths;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -45,7 +43,7 @@
   @Rule
   public final DesugarRule desugarRule =
       DesugarRule.builder(this, lookup)
-          .addSourceInputs(getInputSourceFilesFromJvmOption("input_srcs"))
+          .addSourceInputs(getRuntimePathsFromJvmFlag("input_srcs"))
           .addJavacOptions("-source 11", "-target 11")
           .addCommandOptions("desugar_nest_based_private_access", "true")
           .addCommandOptions("allow_empty_bootclasspath", "true")
@@ -54,12 +52,6 @@
           .addCommandOptions("rewrite_core_library_prefix", "javadesugar/testing/")
           .build();
 
-  private static Path[] getInputSourceFilesFromJvmOption(String jvmOptionKey) {
-    return Splitter.on(" ").trimResults().splitToList(System.getProperty(jvmOptionKey)).stream()
-        .map(Paths::get)
-        .toArray(Path[]::new);
-  }
-
   @Test
   public void inputClassFileMajorVersions(
       @AsmNode(className = "javadesugar.testing.TestCoreType$MateA", round = 0) ClassNode before,
diff --git a/src/test/java/com/google/devtools/build/android/desugar/nest/NestDesugaringMethodAccessTest.java b/src/test/java/com/google/devtools/build/android/desugar/nest/NestDesugaringMethodAccessTest.java
index d178414..929a9a9 100644
--- a/src/test/java/com/google/devtools/build/android/desugar/nest/NestDesugaringMethodAccessTest.java
+++ b/src/test/java/com/google/devtools/build/android/desugar/nest/NestDesugaringMethodAccessTest.java
@@ -16,14 +16,15 @@
 
 package com.google.devtools.build.android.desugar.nest;
 
-import static com.google.common.collect.ImmutableList.toImmutableList;
 import static com.google.common.truth.Truth.assertThat;
 
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
+import com.google.devtools.build.android.desugar.langmodel.MemberUseKind;
+import com.google.devtools.build.android.desugar.langmodel.MethodInvocationSite;
 import com.google.devtools.build.android.desugar.testing.junit.AsmNode;
 import com.google.devtools.build.android.desugar.testing.junit.DesugarRule;
 import com.google.devtools.build.android.desugar.testing.junit.DesugarRunner;
+import com.google.devtools.build.android.desugar.testing.junit.DesugarTestHelpers;
 import com.google.devtools.build.android.desugar.testing.junit.DynamicClassLiteral;
 import com.google.devtools.build.android.desugar.testing.junit.JdkSuppress;
 import com.google.devtools.build.android.desugar.testing.junit.JdkVersion;
@@ -40,10 +41,7 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.tree.AbstractInsnNode;
 import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.MethodInsnNode;
 import org.objectweb.asm.tree.MethodNode;
 
 /** Tests for accessing private methods from another class within a nest. */
@@ -214,18 +212,20 @@
   public void invokeVirtualOnPrivateMethod_beforeDesugaring(
       @AsmNode(className = "NonNest", memberName = "invokeTwoSum", round = 0)
           MethodNode invokeTwoSum) {
-    MethodInsnNode twoSumInvocation =
-        Iterables.getOnlyElement(findMethodInvocations(invokeTwoSum, "twoSum"));
-    assertThat(twoSumInvocation.getOpcode()).isEqualTo(Opcodes.INVOKEVIRTUAL);
+    MethodInvocationSite twoSumInvocation =
+        Iterables.getOnlyElement(
+            DesugarTestHelpers.findMethodInvocationSites(invokeTwoSum, "NonNest", "twoSum", ".*"));
+    assertThat(twoSumInvocation.invocationKind()).isEqualTo(MemberUseKind.INVOKEVIRTUAL);
   }
 
   @Test
   public void invokeSpecialOnPrivateMethod_afterDesugaring(
       @AsmNode(className = "NonNest", memberName = "invokeTwoSum", round = 1)
           MethodNode invokeTwoSum) {
-    MethodInsnNode twoSumInvocation =
-        Iterables.getOnlyElement(findMethodInvocations(invokeTwoSum, "twoSum"));
-    assertThat(twoSumInvocation.getOpcode()).isEqualTo(Opcodes.INVOKESPECIAL);
+    MethodInvocationSite twoSumInvocation =
+        Iterables.getOnlyElement(
+            DesugarTestHelpers.findMethodInvocationSites(invokeTwoSum, "NonNest", "twoSum", ".*"));
+    assertThat(twoSumInvocation.invocationKind()).isEqualTo(MemberUseKind.INVOKESPECIAL);
   }
 
   @Test
@@ -237,13 +237,4 @@
     assertThat(result).isEqualTo(1005L);
   }
 
-  private static ImmutableList<MethodInsnNode> findMethodInvocations(
-      MethodNode enclosingMethod, String invokedMethodName) {
-    AbstractInsnNode[] instructions = enclosingMethod.instructions.toArray();
-    return Arrays.stream(instructions)
-        .filter(node -> node.getType() == AbstractInsnNode.METHOD_INSN)
-        .map(node -> (MethodInsnNode) node)
-        .filter(node -> invokedMethodName.equals(node.name))
-        .collect(toImmutableList());
-  }
 }
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/testing/junit/DesugarRuleBuilder.java b/src/tools/android/java/com/google/devtools/build/android/desugar/testing/junit/DesugarRuleBuilder.java
index f4abb75..ace60d5 100644
--- a/src/tools/android/java/com/google/devtools/build/android/desugar/testing/junit/DesugarRuleBuilder.java
+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/testing/junit/DesugarRuleBuilder.java
@@ -16,7 +16,6 @@
 
 package com.google.devtools.build.android.desugar.testing.junit;
 
-import com.google.common.base.Splitter;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableListMultimap;
@@ -159,7 +158,7 @@
    *  .addSourceInputsFromJvmFlag("input_srcs").</code> in your test class.
    */
   public DesugarRuleBuilder addSourceInputsFromJvmFlag(String jvmFlagKey) {
-    return addSourceInputs(getRuntimePathsFromJvmFlag(jvmFlagKey));
+    return addSourceInputs(DesugarTestHelpers.getRuntimePathsFromJvmFlag(jvmFlagKey));
   }
 
   /**
@@ -169,17 +168,7 @@
    *  .addSourceInputsFromJvmFlag("input_srcs").</code> in your test class.
    */
   public DesugarRuleBuilder addJarInputsFromJvmFlag(String jvmFlagKey) {
-    return addInputs(getRuntimePathsFromJvmFlag(jvmFlagKey));
-  }
-
-  /**
-   * A helper method that reads file paths into an array from the JVM flag value associated with
-   * {@param jvmFlagKey}.
-   */
-  public static Path[] getRuntimePathsFromJvmFlag(String jvmFlagKey) {
-    return Splitter.on(" ").trimResults().splitToList(System.getProperty(jvmFlagKey)).stream()
-        .map(Paths::get)
-        .toArray(Path[]::new);
+    return addInputs(DesugarTestHelpers.getRuntimePathsFromJvmFlag(jvmFlagKey));
   }
 
   /**
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/testing/junit/DesugarTestHelpers.java b/src/tools/android/java/com/google/devtools/build/android/desugar/testing/junit/DesugarTestHelpers.java
new file mode 100644
index 0000000..2292776
--- /dev/null
+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/testing/junit/DesugarTestHelpers.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2020 The Bazel Authors. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.devtools.build.android.desugar.testing.junit;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.ImmutableList.toImmutableList;
+
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.android.desugar.langmodel.ClassName;
+import com.google.devtools.build.android.desugar.langmodel.MemberUseKind;
+import com.google.devtools.build.android.desugar.langmodel.MethodInvocationSite;
+import com.google.devtools.build.android.desugar.langmodel.MethodKey;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.function.Predicate;
+import java.util.regex.Pattern;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+
+/** Static utilities that facilities desugar testing. */
+public class DesugarTestHelpers {
+
+  /**
+   * A helper method that reads file paths into an array from the JVM flag value associated with
+   * {@param jvmFlagKey}.
+   */
+  public static Path[] getRuntimePathsFromJvmFlag(String jvmFlagKey) {
+    String jvmPropertyValue =
+        checkNotNull(
+            System.getProperty(jvmFlagKey),
+            "Expected JVM Option to be specified: -D<%s>=<YourValue>",
+            jvmFlagKey);
+    return Splitter.on(" ").trimResults().splitToList(jvmPropertyValue).stream()
+        .map(Paths::get)
+        .toArray(Path[]::new);
+  }
+
+  /** Find all matched method invocation instructions in the given method. */
+  public static ImmutableList<MethodInvocationSite> findMethodInvocationSites(
+      MethodNode enclosingMethod,
+      String methodOwnerRegex,
+      String methodNameRegex,
+      String methodDescRegex) {
+    Predicate<String> methodOwnerPredicate = Pattern.compile(methodOwnerRegex).asPredicate();
+    Predicate<String> methodNamePredicate = Pattern.compile(methodNameRegex).asPredicate();
+    Predicate<String> methodDescPredicate = Pattern.compile(methodDescRegex).asPredicate();
+    AbstractInsnNode[] instructions = enclosingMethod.instructions.toArray();
+    return Arrays.stream(instructions)
+        .filter(node -> node.getType() == AbstractInsnNode.METHOD_INSN)
+        .map(node -> (MethodInsnNode) node)
+        .filter(node -> methodOwnerPredicate.test(node.owner))
+        .filter(node -> methodNamePredicate.test(node.name))
+        .filter(node -> methodDescPredicate.test(node.desc))
+        .map(
+            node ->
+                MethodInvocationSite.builder()
+                    .setInvocationKind(MemberUseKind.fromValue(node.getOpcode()))
+                    .setMethod(MethodKey.create(ClassName.create(node.owner), node.name, node.desc))
+                    .setIsInterface(node.itf)
+                    .build())
+        .collect(toImmutableList());
+  }
+
+  private DesugarTestHelpers() {}
+}
