diff --git a/apps/kubevirt-networking/api/src/test/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtRouterTest.java b/apps/kubevirt-networking/api/src/test/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtRouterTest.java
new file mode 100644
index 0000000..2ced87e
--- /dev/null
+++ b/apps/kubevirt-networking/api/src/test/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtRouterTest.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2021-present Open Networking Foundation
+ *
+ * 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 org.onosproject.kubevirtnetworking.api;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+
+import static junit.framework.TestCase.assertEquals;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.FLAT;
+import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.VXLAN;
+
+/**
+ * Unit tests for the default kubevirt router class.
+ */
+public class DefaultKubevirtRouterTest {
+
+    private static final String NAME_1 = "router-1";
+    private static final String NAME_2 = "router-2";
+    private static final String DESCRIPTION_1 = "dummy router 1";
+    private static final String DESCRIPTION_2 = "dummy router 2";
+    private static final boolean ENABLE_SNAT_1 = false;
+    private static final boolean ENABLE_SNAT_2 = true;
+    private static final KubevirtNetwork.Type TYPE_1 = FLAT;
+    private static final KubevirtNetwork.Type TYPE_2 = VXLAN;
+    private static final String NETWORK_NAME_1 = "net-1";
+    private static final String NETWORK_NAME_2 = "net-2";
+
+    private static final KubevirtPeerRouter PEER_ROUTER_1 =
+            new KubevirtPeerRouter(IpAddress.valueOf("192.168.10.10"),
+                    MacAddress.valueOf("11:22:33:44:55:66"));
+    private static final KubevirtPeerRouter PEER_ROUTER_2 =
+            new KubevirtPeerRouter(IpAddress.valueOf("192.168.20.20"),
+                    MacAddress.valueOf("22:33:44:55:66:77"));
+
+    private KubevirtRouter router1;
+    private KubevirtRouter sameAsRouter1;
+    private KubevirtRouter router2;
+
+    /**
+     * Tests class immutability.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DefaultKubevirtRouter.class);
+    }
+
+    /**
+     * Initial setup for this unit test.
+     */
+    @Before
+    public void setUp() {
+        router1 = DefaultKubevirtRouter.builder()
+                .name(NAME_1)
+                .description(DESCRIPTION_1)
+                .enableSnat(ENABLE_SNAT_1)
+                .internal(ImmutableSet.of(NETWORK_NAME_1))
+                .external(ImmutableMap.of(IpAddress.valueOf("10.10.10.10"), NETWORK_NAME_1))
+                .peerRouter(PEER_ROUTER_1)
+                .build();
+        sameAsRouter1 = DefaultKubevirtRouter.builder()
+                .name(NAME_1)
+                .description(DESCRIPTION_1)
+                .enableSnat(ENABLE_SNAT_1)
+                .internal(ImmutableSet.of(NETWORK_NAME_1))
+                .external(ImmutableMap.of(IpAddress.valueOf("10.10.10.10"), NETWORK_NAME_1))
+                .peerRouter(PEER_ROUTER_1)
+                .build();
+        router2 = DefaultKubevirtRouter.builder()
+                .name(NAME_2)
+                .description(DESCRIPTION_2)
+                .enableSnat(ENABLE_SNAT_2)
+                .internal(ImmutableSet.of(NETWORK_NAME_2))
+                .external(ImmutableMap.of(IpAddress.valueOf("20.20.20.20"), NETWORK_NAME_2))
+                .peerRouter(PEER_ROUTER_2)
+                .build();
+    }
+
+    /**
+     * Tests object equality.
+     */
+    @Test
+    public void testEquality() {
+        new EqualsTester().addEqualityGroup(router1, sameAsRouter1)
+                .addEqualityGroup(router2)
+                .testEquals();
+    }
+
+    /**
+     * Test object construction.
+     */
+    @Test
+    public void testConstruction() {
+        KubevirtRouter router = router1;
+
+        assertEquals(NAME_1, router.name());
+        assertEquals(DESCRIPTION_1, router.description());
+        assertEquals(ENABLE_SNAT_1, router.enableSnat());
+        assertEquals(ImmutableSet.of(NETWORK_NAME_1), router.internal());
+        assertEquals(ImmutableMap.of(IpAddress.valueOf("10.10.10.10"), NETWORK_NAME_1), router.external());
+        assertEquals(PEER_ROUTER_1, router.peerRouter());
+    }
+}
