diff --git a/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/DefaultIsisControllerTest.java b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/DefaultIsisControllerTest.java
index 915727d..61af4d7 100644
--- a/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/DefaultIsisControllerTest.java
+++ b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/DefaultIsisControllerTest.java
@@ -15,9 +15,13 @@
  */
 package org.onosproject.isis.controller.impl;
 
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.easymock.EasyMock;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.onosproject.isis.controller.topology.IsisRouterListener;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.notNullValue;
@@ -27,11 +31,43 @@
  * Unit test case for DefaultIsisController.
  */
 public class DefaultIsisControllerTest {
+    private ObjectMapper mapper;
+    private JsonNode jsonNode;
     private DefaultIsisController defaultIsisController;
+    private String jsonString = "{" +
+            "                \"processes\": [{" +
+            "                                \"processId\": \"4.4.4.4\"," +
+            "                                \"interface\": [{" +
+            "                                                \"interfaceIndex\": \"2\"," +
+            "                                                \"macAddress\": \"08:00:27:b7:ab:bf\"," +
+            "                                                \"interfaceIp\": \"192.168.56.101\"," +
+            "                                                \"networkMask\": \"255.255.255.224\"," +
+            "                                                \"intermediateSystemName\": \"ROUTERONE\"," +
+            "                                                \"systemId\": \"2929.2929.2929\"," +
+            "                                                \"lanId\": \"0000.0000.0000.00\"," +
+            "                                                \"idLength\": \"0\"," +
+            "                                                \"maxAreaAddresses\": \"3\"," +
+            "                                                \"reservedPacketCircuitType\": \"1\"," +
+            "                                                \"circuitId\": \"10\"," +
+            "                                                \"networkType\": \"2\"," +
+            "                                                \"areaAddress\": \"490000\"," +
+            "                                                \"areaLength\": \"3\"," +
+            "                                                \"lspId\": \"1313131313130000\"," +
+            "                                                \"holdingTime\": \"50\"," +
+            "                                                \"helloInterval\": \"10\"," +
+            "                                                \"priority\": \"0\"" +
+            "                                }]" +
+            "                }]" +
+            "}";
+
+    private IsisRouterListener isisRouterListener;
 
     @Before
     public void setUp() throws Exception {
         defaultIsisController = new DefaultIsisController();
+        mapper = new ObjectMapper();
+        jsonNode = mapper.readTree(jsonString);
+        isisRouterListener = EasyMock.createNiceMock(IsisRouterListener.class);
     }
 
     @After
@@ -66,4 +102,31 @@
         defaultIsisController.allConfiguredProcesses();
         assertThat(defaultIsisController, is(notNullValue()));
     }
+
+    /**
+     * Tests updateConfig() method.
+     */
+    @Test
+    public void testUpdateConfig() throws Exception {
+        defaultIsisController.updateConfig(jsonNode);
+        assertThat(defaultIsisController, is(notNullValue()));
+    }
+
+    /**
+     * Tests addRouterListener() method.
+     */
+    @Test
+    public void testaddRouterListener() throws Exception {
+        defaultIsisController.addRouterListener(isisRouterListener);
+        assertThat(defaultIsisController, is(notNullValue()));
+    }
+
+    /**
+     * Tests removeRouterListener() method.
+     */
+    @Test
+    public void testremoveRouterListener() throws Exception {
+        defaultIsisController.removeRouterListener(isisRouterListener);
+        assertThat(defaultIsisController, is(notNullValue()));
+    }
 }
