diff --git a/app/src/test/java/org/onosproject/segmentrouting/MockRouteService.java b/app/src/test/java/org/onosproject/segmentrouting/MockRouteService.java
index 7927636..bfeca1f 100644
--- a/app/src/test/java/org/onosproject/segmentrouting/MockRouteService.java
+++ b/app/src/test/java/org/onosproject/segmentrouting/MockRouteService.java
@@ -17,18 +17,15 @@
 package org.onosproject.segmentrouting;
 
 import com.google.common.collect.Sets;
-import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
-import org.onlab.packet.MacAddress;
-import org.onlab.packet.VlanId;
 import org.onosproject.routeservice.ResolvedRoute;
-import org.onosproject.routeservice.Route;
 import org.onosproject.routeservice.RouteInfo;
 import org.onosproject.routeservice.RouteServiceAdapter;
 import org.onosproject.routeservice.RouteTableId;
 
 import java.util.Collection;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -36,23 +33,19 @@
  * We assume there is only one routing table named "default".
  */
 public class MockRouteService extends RouteServiceAdapter {
-    private Map<MockRoutingTableKey, MockRoutingTableValue> routingTable;
+    private Map<IpPrefix, Set<ResolvedRoute>> routeStore;
 
-    MockRouteService(Map<MockRoutingTableKey, MockRoutingTableValue> routingTable) {
-        this.routingTable = routingTable;
+    MockRouteService(Map<IpPrefix, Set<ResolvedRoute>> routeStore) {
+        this.routeStore = routeStore;
     }
 
     @Override
     public Collection<RouteInfo> getRoutes(RouteTableId id) {
-        return routingTable.entrySet().stream().map(e -> {
-            IpPrefix prefix = e.getKey().ipPrefix;
-            IpAddress nextHop = IpAddress.valueOf(0); // dummy
-            MacAddress mac = e.getValue().macAddress;
-            VlanId vlan = e.getValue().vlanId;
-            Route route = new Route(Route.Source.STATIC, prefix, nextHop);
-            ResolvedRoute rr = new ResolvedRoute(route, mac, vlan);
-
-            return new RouteInfo(prefix, rr, Sets.newHashSet(rr));
+        return routeStore.entrySet().stream().map(e -> {
+            IpPrefix prefix = e.getKey();
+            Set<ResolvedRoute> resolvedRoutes = e.getValue();
+            ResolvedRoute bestRoute =  resolvedRoutes.stream().findFirst().orElse(null);
+            return new RouteInfo(prefix, bestRoute, resolvedRoutes);
         }).collect(Collectors.toSet());
     }
 
diff --git a/app/src/test/java/org/onosproject/segmentrouting/RouteHandlerTest.java b/app/src/test/java/org/onosproject/segmentrouting/RouteHandlerTest.java
index ef4c2aa..bdf056e 100644
--- a/app/src/test/java/org/onosproject/segmentrouting/RouteHandlerTest.java
+++ b/app/src/test/java/org/onosproject/segmentrouting/RouteHandlerTest.java
@@ -75,6 +75,7 @@
     private static final Map<ConnectPoint, Set<IpPrefix>> SUBNET_TABLE = Maps.newConcurrentMap();
     // Mocked Next Id
     private static final Map<Integer, TrafficTreatment> NEXT_TABLE = Maps.newConcurrentMap();
+    private static final Map<IpPrefix, Set<ResolvedRoute>> ROUTE_STORE = Maps.newConcurrentMap();
 
     private static final IpPrefix P1 = IpPrefix.valueOf("10.0.0.0/24");
 
@@ -167,7 +168,7 @@
         hostService = new MockHostService(HOSTS);
         srManager.hostService = hostService;
         srManager.cfgService = mockNetworkConfigRegistry;
-        srManager.routeService = new MockRouteService(ROUTING_TABLE);
+        srManager.routeService = new MockRouteService(ROUTE_STORE);
 
         routeHandler = new RouteHandler(srManager) {
             // routeEventCache is not necessary for unit tests
@@ -184,9 +185,7 @@
 
     @Test
     public void init() {
-        MockRoutingTableKey rtk = new MockRoutingTableKey(CP1.deviceId(), P1);
-        MockRoutingTableValue rtv = new MockRoutingTableValue(CP1.port(), M1, V1);
-        ROUTING_TABLE.put(rtk, rtv);
+        ROUTE_STORE.put(P1, Sets.newHashSet(RR1));
 
         routeHandler.init(CP1.deviceId());
 
@@ -201,6 +200,27 @@
     }
 
     @Test
+    public void initTwoNextHops() {
+        ROUTE_STORE.put(P1, Sets.newHashSet(RR1, RR2));
+
+        routeHandler.init(CP1.deviceId());
+
+        assertEquals(2, ROUTING_TABLE.size());
+        MockRoutingTableValue rtv1 = ROUTING_TABLE.get(new MockRoutingTableKey(CP1.deviceId(), P1));
+        assertEquals(M1, rtv1.macAddress);
+        assertEquals(V1, rtv1.vlanId);
+        assertEquals(CP1.port(), rtv1.portNumber);
+        MockRoutingTableValue rtv2 = ROUTING_TABLE.get(new MockRoutingTableKey(CP2.deviceId(), P1));
+        assertEquals(M2, rtv2.macAddress);
+        assertEquals(V2, rtv2.vlanId);
+        assertEquals(CP2.port(), rtv2.portNumber);
+
+        assertEquals(2, SUBNET_TABLE.size());
+        assertTrue(SUBNET_TABLE.get(CP1).contains(P1));
+        assertTrue(SUBNET_TABLE.get(CP2).contains(P1));
+    }
+
+    @Test
     public void processRouteAdded() {
         reset(srManager.deviceConfiguration);
         srManager.deviceConfiguration.addSubnet(CP1, P1);
@@ -390,6 +410,8 @@
     public void testDualHomedSingleLocationFail() {
         testOneDualHomedAdded();
 
+        ROUTE_STORE.put(P1, Sets.newHashSet(RR3));
+
         HostEvent he = new HostEvent(HostEvent.Type.HOST_MOVED, H3S, H3D);
         routeHandler.processHostMovedEvent(he);
 
