diff --git a/tests/ethernet/java/com/android/server/ethernet/EthernetTrackerTest.java b/tests/ethernet/java/com/android/server/ethernet/EthernetTrackerTest.java
index 43571bb..22b1b69 100644
--- a/tests/ethernet/java/com/android/server/ethernet/EthernetTrackerTest.java
+++ b/tests/ethernet/java/com/android/server/ethernet/EthernetTrackerTest.java
@@ -19,6 +19,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
+import android.net.InetAddresses;
 import android.net.IpConfiguration;
 import android.net.IpConfiguration.IpAssignment;
 import android.net.IpConfiguration.ProxySettings;
@@ -33,6 +34,7 @@
 import org.junit.runner.RunWith;
 
 import java.net.InetAddress;
+import java.util.ArrayList;
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
@@ -46,28 +48,26 @@
         assertStaticConfiguration(new StaticIpConfiguration(), "");
 
         // Setting only the IP address properly cascades and assumes defaults
-        assertStaticConfiguration(
-                new StaticIpConfigBuilder().setIp("192.0.2.10/24").build(),
-                "ip=192.0.2.10/24");
+        assertStaticConfiguration(new StaticIpConfiguration.Builder()
+                .setIpAddress(new LinkAddress("192.0.2.10/24")).build(), "ip=192.0.2.10/24");
 
+        final ArrayList<InetAddress> dnsAddresses = new ArrayList<>();
+        dnsAddresses.add(InetAddresses.parseNumericAddress("4.4.4.4"));
+        dnsAddresses.add(InetAddresses.parseNumericAddress("8.8.8.8"));
         // Setting other fields properly cascades them
-        assertStaticConfiguration(
-                new StaticIpConfigBuilder()
-                        .setIp("192.0.2.10/24")
-                        .setDns(new String[] {"4.4.4.4", "8.8.8.8"})
-                        .setGateway("192.0.2.1")
-                        .setDomains("android")
-                        .build(),
+        assertStaticConfiguration(new StaticIpConfiguration.Builder()
+                .setIpAddress(new LinkAddress("192.0.2.10/24"))
+                .setDnsServers(dnsAddresses)
+                .setGateway(InetAddresses.parseNumericAddress("192.0.2.1"))
+                .setDomains("android").build(),
                 "ip=192.0.2.10/24 dns=4.4.4.4,8.8.8.8 gateway=192.0.2.1 domains=android");
 
         // Verify order doesn't matter
-        assertStaticConfiguration(
-                new StaticIpConfigBuilder()
-                        .setIp("192.0.2.10/24")
-                        .setDns(new String[] {"4.4.4.4", "8.8.8.8"})
-                        .setGateway("192.0.2.1")
-                        .setDomains("android")
-                        .build(),
+        assertStaticConfiguration(new StaticIpConfiguration.Builder()
+                .setIpAddress(new LinkAddress("192.0.2.10/24"))
+                .setDnsServers(dnsAddresses)
+                .setGateway(InetAddresses.parseNumericAddress("192.0.2.1"))
+                .setDomains("android").build(),
                 "domains=android ip=192.0.2.10/24 gateway=192.0.2.1 dns=4.4.4.4,8.8.8.8 ");
     }
 
@@ -96,43 +96,15 @@
 
     private void assertStaticConfiguration(StaticIpConfiguration expectedStaticIpConfig,
                 String configAsString) {
-        IpConfiguration expectedIpConfiguration = new IpConfiguration(IpAssignment.STATIC,
-                ProxySettings.NONE, expectedStaticIpConfig, null);
+        final IpConfiguration expectedIpConfiguration = new IpConfiguration();
+        expectedIpConfiguration.setIpAssignment(IpAssignment.STATIC);
+        expectedIpConfiguration.setProxySettings(ProxySettings.NONE);
+        expectedIpConfiguration.setStaticIpConfiguration(expectedStaticIpConfig);
 
         assertEquals(expectedIpConfiguration,
                 EthernetTracker.parseStaticIpConfiguration(configAsString));
     }
 
-    private static class StaticIpConfigBuilder {
-        private final StaticIpConfiguration config = new StaticIpConfiguration();
-
-        StaticIpConfigBuilder setIp(String address) {
-            config.ipAddress = new LinkAddress(address);
-            return this;
-        }
-
-        StaticIpConfigBuilder setDns(String[] dnsArray) {
-            for (String dns : dnsArray) {
-                config.dnsServers.add(InetAddress.parseNumericAddress(dns));
-            }
-            return this;
-        }
-
-        StaticIpConfigBuilder setGateway(String gateway) {
-            config.gateway = InetAddress.parseNumericAddress(gateway);
-            return this;
-        }
-
-        StaticIpConfigBuilder setDomains(String domains) {
-            config.domains = domains;
-            return this;
-        }
-
-        StaticIpConfiguration build() {
-            return new StaticIpConfiguration(config);
-        }
-    }
-
     private NetworkCapabilities.Builder makeEthernetCapabilitiesBuilder(boolean clearAll) {
         final NetworkCapabilities.Builder builder =
                 clearAll ? new NetworkCapabilities.Builder().clearAll()
