diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 813fcc0c5a716..e1095a47efeca 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -1126,6 +1126,7 @@ android_library("chrome_test_java") {
     "//third_party/android_deps:androidx_recyclerview_recyclerview_java",
     "//third_party/android_deps:androidx_test_runner_java",
     "//third_party/android_deps:androidx_viewpager_viewpager_java",
+    "//url:gurl_javatests",
     "//url:origin_java",
 
     # TODO (bjoyce): Remove recyclerview_v7 when espresso tests are migrated
@@ -1894,6 +1895,7 @@ android_library("browser_java_test_support") {
     "//third_party/android_deps:androidx_annotation_annotation_java",
     "//third_party/android_deps:protobuf_lite_runtime_java",
     "//third_party/junit",
+    "//url:gurl_android_test_helper_java",
   ]
 }
 
@@ -1916,6 +1918,7 @@ static_library("browser_test_support") {
     "//components/query_tiles/test:test_support",
     "//content/test:test_support",
     "//net:test_support",
+    "//url:gurl_android_test_helper",
   ]
 }
 
diff --git a/url/BUILD.gn b/url/BUILD.gn
index 06c29f169e091..b14a1dca7af67 100644
--- a/url/BUILD.gn
+++ b/url/BUILD.gn
@@ -222,15 +222,6 @@ test("url_unittests") {
       "//url/mojom:test_url_mojom_gurl",
     ]
   }
-  if (is_android) {
-    sources += [ "android/gurl_android_unittest.cc" ]
-    deps += [
-      ":gurl_android",
-      ":gurl_java",
-      ":gurl_javatests",
-      ":native_j_unittests_jni_headers",
-    ]
-  }
 }
 
 test("url_perftests") {
@@ -258,17 +249,42 @@ fuzzer_test("gurl_fuzzer") {
 }
 
 if (is_android) {
-  android_library("gurl_javatests") {
+  source_set("gurl_android_test_helper") {
     testonly = true
-    sources = [
-      "android/native_java_unittests/src/org/chromium/url/GURLJavaTest.java",
+    sources = [ "android/gurl_java_test_helper.cc" ]
+    deps = [
+      ":gurl_android",
+      ":gurl_j_test_jni_headers",
+      ":url",
+      "//base/test:test_support",
+      "//testing/gtest",
     ]
+  }
+
+  android_library("gurl_android_test_helper_java") {
+    testonly = true
+    sources =
+        [ "android/javatests/src/org/chromium/url/GURLJavaTestHelper.java" ]
     deps = [
       ":gurl_java",
-      ":gurl_jni_headers",
       "//base:base_java",
       "//base:base_java_test_support",
       "//base:jni_java",
+    ]
+  }
+
+  android_library("gurl_javatests") {
+    testonly = true
+    sources = [ "android/javatests/src/org/chromium/url/GURLJavaTest.java" ]
+    deps = [
+      ":gurl_android_test_helper_java",
+      ":gurl_java",
+      "//base:base_java",
+      "//base:base_java_test_support",
+      "//base:jni_java",
+      "//content/public/test/android:content_java_test_support",
+      "//third_party/android_deps:androidx_core_core_java",
+      "//third_party/android_deps:androidx_test_runner_java",
       "//third_party/android_support_test_runner:rules_java",
       "//third_party/android_support_test_runner:runner_java",
       "//third_party/junit",
@@ -279,10 +295,9 @@ if (is_android) {
 
   # See https://bugs.chromium.org/p/chromium/issues/detail?id=908819 for why we
   # can't put 'java' in the name here.
-  generate_jni("native_j_unittests_jni_headers") {
+  generate_jni("gurl_j_test_jni_headers") {
     testonly = true
-    sources = [
-      "android/native_java_unittests/src/org/chromium/url/GURLJavaTest.java",
-    ]
+    sources =
+        [ "android/javatests/src/org/chromium/url/GURLJavaTestHelper.java" ]
   }
 }
diff --git a/url/android/gurl_android_unittest.cc b/url/android/gurl_java_test_helper.cc
similarity index 76%
rename from url/android/gurl_android_unittest.cc
rename to url/android/gurl_java_test_helper.cc
index fe2b7088e4e01..ba6409b3b312d 100644
--- a/url/android/gurl_android_unittest.cc
+++ b/url/android/gurl_java_test_helper.cc
@@ -6,29 +6,21 @@
 
 #include "base/android/jni_android.h"
 #include "base/android/jni_string.h"
+#include "base/test/icu_test_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/android/gurl_android.h"
 #include "url/gurl.h"
-#include "url/native_j_unittests_jni_headers/GURLJavaTest_jni.h"
+#include "url/gurl_j_test_jni_headers/GURLJavaTestHelper_jni.h"
 
 using base::android::AttachCurrentThread;
 
 namespace url {
 
-class GURLAndroidTest : public ::testing::Test {
- public:
-  GURLAndroidTest()
-      : j_test_(Java_GURLJavaTest_Constructor(AttachCurrentThread())) {}
+static void JNI_GURLJavaTestHelper_InitializeICU(JNIEnv* env) {
+  base::test::InitializeICUForTesting();
+}
 
-  const base::android::ScopedJavaGlobalRef<jobject>& j_test() {
-    return j_test_;
-  }
-
- private:
-  base::android::ScopedJavaGlobalRef<jobject> j_test_;
-};
-
-TEST_F(GURLAndroidTest, TestGURLEquivalence) {
+static void JNI_GURLJavaTestHelper_TestGURLEquivalence(JNIEnv* env) {
   const char* cases[] = {
       // Common Standard URLs.
       "https://www.google.com",
@@ -62,17 +54,14 @@ TEST_F(GURLAndroidTest, TestGURLEquivalence) {
       // Invalid URLs.
       "foobar",
   };
-  JNIEnv* env = AttachCurrentThread();
   for (const char* uri : cases) {
     GURL gurl(uri);
     base::android::ScopedJavaLocalRef<jobject> j_gurl =
-        Java_GURLJavaTest_createGURL(
-            env, j_test(), base::android::ConvertUTF8ToJavaString(env, uri));
+        Java_GURLJavaTestHelper_createGURL(
+            env, base::android::ConvertUTF8ToJavaString(env, uri));
     std::unique_ptr<GURL> gurl2 = GURLAndroid::ToNativeGURL(env, j_gurl);
     EXPECT_EQ(gurl, *gurl2);
   }
 }
 
-JAVA_TESTS(GURLAndroidTest, j_test())
-
 }  // namespace url
diff --git a/url/android/javatests/DEPS b/url/android/javatests/DEPS
new file mode 100644
index 0000000000000..aa93591311928
--- /dev/null
+++ b/url/android/javatests/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+content/public/test/android",
+]
diff --git a/url/android/native_java_unittests/src/org/chromium/url/GURLJavaTest.java b/url/android/javatests/src/org/chromium/url/GURLJavaTest.java
similarity index 91%
rename from url/android/native_java_unittests/src/org/chromium/url/GURLJavaTest.java
rename to url/android/javatests/src/org/chromium/url/GURLJavaTest.java
index 0517ddf7edcb4..d29b1aca8ff74 100644
--- a/url/android/native_java_unittests/src/org/chromium/url/GURLJavaTest.java
+++ b/url/android/javatests/src/org/chromium/url/GURLJavaTest.java
@@ -7,12 +7,18 @@ package org.chromium.url;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.doThrow;
 
+import androidx.test.filters.SmallTest;
+
 import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.CalledByNativeJavaTest;
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.util.Batch;
+import org.chromium.content_public.browser.test.NativeLibraryTestUtils;
 
 import java.net.URISyntaxException;
 
@@ -21,18 +27,18 @@ import java.net.URISyntaxException;
  * the logic is tested there. This test is primarily to make sure everything is plumbed through
  * correctly.
  */
+@RunWith(BaseJUnit4ClassRunner.class)
+@Batch(Batch.UNIT_TESTS)
 public class GURLJavaTest {
     @Mock
     GURL.Natives mGURLMocks;
 
-    @CalledByNative
-    private GURLJavaTest() {
+    @Before
+    public void setUp() {
         MockitoAnnotations.initMocks(this);
-    }
 
-    @CalledByNative
-    public GURL createGURL(String uri) {
-        return new GURL(uri);
+        NativeLibraryTestUtils.loadNativeLibraryNoBrowserProcess();
+        GURLJavaTestHelper.nativeInitializeICU();
     }
 
     private void deepAssertEquals(GURL expected, GURL actual) {
@@ -51,8 +57,15 @@ public class GURLJavaTest {
         return Integer.toString(serialization.length()) + GURL.SERIALIZER_DELIMITER + serialization;
     }
 
+    @SmallTest
+    @Test
+    public void testGURLEquivalence() {
+        GURLJavaTestHelper.nativeTestGURLEquivalence();
+    }
+
     // Equivalent of GURLTest.Components
-    @CalledByNativeJavaTest
+    @SmallTest
+    @Test
     @SuppressWarnings(value = "AuthLeak")
     public void testComponents() {
         GURL empty = new GURL("");
@@ -85,7 +98,8 @@ public class GURLJavaTest {
     }
 
     // Equivalent of GURLTest.Empty
-    @CalledByNativeJavaTest
+    @SmallTest
+    @Test
     public void testEmpty() {
         GURLJni.TEST_HOOKS.setInstanceForTesting(mGURLMocks);
         doThrow(new RuntimeException("Should not need to parse empty URL"))
@@ -107,7 +121,8 @@ public class GURLJavaTest {
     }
 
     // Test that GURL and URI return the correct Origin.
-    @CalledByNativeJavaTest
+    @SmallTest
+    @Test
     @SuppressWarnings(value = "AuthLeak")
     public void testOrigin() throws URISyntaxException {
         final String kExpectedOrigin1 = "http://google.com:21/";
@@ -122,12 +137,13 @@ public class GURLJavaTest {
         Assert.assertEquals(kExpectedOrigin1, origin.getSpec());
     }
 
-    @CalledByNativeJavaTest
+    @SmallTest
+    @Test
     public void testWideInput() throws URISyntaxException {
         final String kExpectedSpec = "http://xn--1xa.com/";
 
         GURL url = new GURL("http://\u03C0.com");
-        Assert.assertEquals("http://xn--1xa.com/", url.getSpec());
+        Assert.assertEquals(kExpectedSpec, url.getSpec());
         Assert.assertEquals("http", url.getScheme());
         Assert.assertEquals("", url.getUsername());
         Assert.assertEquals("", url.getPassword());
@@ -138,7 +154,8 @@ public class GURLJavaTest {
         Assert.assertEquals("", url.getRef());
     }
 
-    @CalledByNativeJavaTest
+    @SmallTest
+    @Test
     @SuppressWarnings(value = "AuthLeak")
     public void testSerialization() {
         GURL cases[] = {
@@ -194,7 +211,8 @@ public class GURLJavaTest {
      * Tests that we re-parse the URL from the spec, which must always be the last token in the
      * serialization, if the serialization version differs.
      */
-    @CalledByNativeJavaTest
+    @SmallTest
+    @Test
     public void testSerializationWithVersionSkew() {
         GURL url = new GURL("https://www.google.com");
         String serialization = (GURL.SERIALIZER_VERSION + 1)
@@ -208,7 +226,8 @@ public class GURLJavaTest {
     /**
      * Tests that fields that aren't visible to java code are correctly serialized.
      */
-    @CalledByNativeJavaTest
+    @SmallTest
+    @Test
     public void testSerializationOfPrivateFields() {
         String serialization = GURL.SERIALIZER_VERSION
                 + ",true,"
@@ -226,7 +245,8 @@ public class GURLJavaTest {
     /**
      * Tests serialized GURL truncated by storage.
      */
-    @CalledByNativeJavaTest
+    @SmallTest
+    @Test
     public void testTruncatedDeserialization() {
         String serialization = "123,1,true,1,2,3,4,5,6,7,8,9,10";
         serialization = serialization.replace(',', GURL.SERIALIZER_DELIMITER);
@@ -237,7 +257,8 @@ public class GURLJavaTest {
     /**
      * Tests serialized GURL truncated by storage.
      */
-    @CalledByNativeJavaTest
+    @SmallTest
+    @Test
     public void testCorruptedSerializations() {
         String serialization = new GURL("https://www.google.ca").serialize();
         // Replace the scheme length (5) with an extra delimiter.
diff --git a/url/android/javatests/src/org/chromium/url/GURLJavaTestHelper.java b/url/android/javatests/src/org/chromium/url/GURLJavaTestHelper.java
new file mode 100644
index 0000000000000..3bd91a3941a68
--- /dev/null
+++ b/url/android/javatests/src/org/chromium/url/GURLJavaTestHelper.java
@@ -0,0 +1,22 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.url;
+
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.JNINamespace;
+
+/**
+ * Helpers for GURLJavaTest that need to call into native code.
+ */
+@JNINamespace("url")
+public class GURLJavaTestHelper {
+    @CalledByNative
+    public static GURL createGURL(String uri) {
+        return new GURL(uri);
+    }
+
+    public static native void nativeInitializeICU();
+    public static native void nativeTestGURLEquivalence();
+}