diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
index 04b7b45..8e50a2f 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
@@ -58,7 +58,6 @@
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkGlobalLibrary;
-import com.google.devtools.build.lib.syntax.CallUtils;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.EvalUtils;
 import com.google.devtools.build.lib.syntax.Printer;
@@ -66,6 +65,7 @@
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.syntax.SkylarkList.MutableList;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
+import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.testutil.MoreAsserts;
 import com.google.devtools.build.lib.util.Fingerprint;
@@ -186,13 +186,18 @@
     return (StructImpl) configuredTarget.get(key);
   }
 
-  private void setupSkylarkFunction(String line) throws Exception {
-    update("mock", CallUtils.getBuiltinCallable(this, "mock"));
-    exec(line);
+  // Defines all @SkylarkCallable-annotated methods (mock, throw, ...) in the environment.
+  private void defineTestMethods() throws Exception {
+    ImmutableMap.Builder<String, Object> env = ImmutableMap.builder();
+    Starlark.addMethods(env, this);
+    for (Map.Entry<String, Object> entry : env.build().entrySet()) {
+      update(entry.getKey(), entry.getValue());
+    }
   }
 
   private void checkSkylarkFunctionError(String errorSubstring, String line) throws Exception {
-    EvalException e = assertThrows(EvalException.class, () -> setupSkylarkFunction(line));
+    defineTestMethods();
+    EvalException e = assertThrows(EvalException.class, () -> exec(line));
     assertThat(e).hasMessageThat().contains(errorSubstring);
   }
 
@@ -200,7 +205,8 @@
 
   @Test
   public void testSkylarkFunctionPosArgs() throws Exception {
-    setupSkylarkFunction("a = mock('a', 'b', mandatory_key='c')");
+    defineTestMethods();
+    exec("a = mock('a', 'b', mandatory_key='c')");
     Map<?, ?> params = (Map<?, ?>) lookup("a");
     assertThat(params.get("mandatory")).isEqualTo("a");
     assertThat(params.get("optional")).isEqualTo("b");
@@ -210,7 +216,8 @@
 
   @Test
   public void testSkylarkFunctionKwArgs() throws Exception {
-    setupSkylarkFunction("a = mock(optional='b', mandatory='a', mandatory_key='c')");
+    defineTestMethods();
+    exec("a = mock(optional='b', mandatory='a', mandatory_key='c')");
     Map<?, ?> params = (Map<?, ?>) lookup("a");
     assertThat(params.get("mandatory")).isEqualTo("a");
     assertThat(params.get("optional")).isEqualTo("b");
@@ -1893,10 +1900,9 @@
 
   @Test
   public void testStackTraceWithoutOriginalMessage() throws Exception {
-    update("throw", CallUtils.getBuiltinCallable(this, "throw1"));
+    defineTestMethods();
     checkEvalErrorContains(
-        "There Is No Message: SkylarkRuleImplementationFunctionsTest",
-        "throw()");
+        "There Is No Message: SkylarkRuleImplementationFunctionsTest", "throw1()");
   }
 
   @SkylarkCallable(name = "throw2", documented = false)
@@ -1906,8 +1912,8 @@
 
   @Test
   public void testNoStackTraceOnInterrupt() throws Exception {
-    update("throw", CallUtils.getBuiltinCallable(this, "throw2"));
-    assertThrows(InterruptedException.class, () -> eval("throw()"));
+    defineTestMethods();
+    assertThrows(InterruptedException.class, () -> eval("throw2()"));
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
index 672fee8..f840c7c 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
@@ -414,9 +414,7 @@
         allowReturnNones = true)
     public ClassObject proxyMethodsObject() {
       ImmutableMap.Builder<String, Object> builder = new ImmutableMap.Builder<>();
-      for (String nativeFunction : CallUtils.getMethodNames(Mock.class)) {
-        builder.put(nativeFunction, CallUtils.getBuiltinCallable(this, nativeFunction));
-      }
+      Starlark.addMethods(builder, this);
       return StructProvider.STRUCT.create(builder.build(), "no native callable '%s'");
     }
 
