diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/DashboardController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/DashboardController.java
index adb91ec..d1483a2 100644
--- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/DashboardController.java
+++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/DashboardController.java
@@ -75,11 +75,18 @@
 public class DashboardController  extends RestrictedBaseController{
 	private static final Logger policyLogger = FlexLogger.getLogger(DashboardController.class);
 	@Autowired
+	CommonClassDao commonClassDao;
+	
+	@Autowired
 	SystemLogDbDao systemDAO;
 
-	@Autowired
-	CommonClassDao commonClassDao;
-
+	public void setCommonClassDao(CommonClassDao commonClassDao) {
+		this.commonClassDao = commonClassDao;
+	}
+	public void setSystemLogDbDao(SystemLogDbDao systemDAO){
+		this.systemDAO = systemDAO;
+	}
+	 
 	private int pdpCount;
 	private PDPGroupContainer pdpConatiner;
 	private ArrayList<Object> pdpStatusData;
diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyRolesController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyRolesController.java
index 4b96615..daf3d6c 100644
--- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyRolesController.java
+++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyRolesController.java
@@ -61,6 +61,10 @@
 	@Autowired
 	CommonClassDao commonClassDao;
 	
+	public void setCommonClassDao(CommonClassDao commonClassDao) {
+		this.commonClassDao = commonClassDao;
+	}
+	
 	List<String> scopelist;
 	
 	@RequestMapping(value={"/get_RolesData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
diff --git a/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/DashboardControllerTest.java b/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/DashboardControllerTest.java
new file mode 100644
index 0000000..ba88dd3
--- /dev/null
+++ b/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/DashboardControllerTest.java
@@ -0,0 +1,127 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * POLICY-SDK-APP
+ * ================================================================================
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.policy.controller;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
+
+import java.io.UnsupportedEncodingException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.policy.common.logging.flexlogger.FlexLogger;
+import org.onap.policy.common.logging.flexlogger.Logger;
+import org.onap.policy.dao.SystemLogDbDao;
+import org.onap.policy.rest.dao.CommonClassDao;
+import org.onap.policy.xacml.std.pap.StdEngine;
+import org.springframework.mock.web.MockHttpServletResponse;
+
+public class DashboardControllerTest{
+	private static Logger logger = FlexLogger.getLogger(DashboardControllerTest.class);
+	
+	private static CommonClassDao commonClassDao;
+	private static SystemLogDbDao systemDAO;
+	private static PolicyController ctrl = null;
+	private HttpServletRequest request = null;
+	private DashboardController controller = null;
+	private MockHttpServletResponse response = null;
+	private Path repo;
+	StdEngine engine = null;
+	
+	@Before
+	public void setUp() throws Exception {
+		logger.info("setUp: Entering");
+		controller = new DashboardController();
+		commonClassDao = Mockito.mock(CommonClassDao.class);
+		systemDAO = Mockito.mock(SystemLogDbDao.class); 
+		controller.setSystemLogDbDao(systemDAO);
+		controller.setCommonClassDao(commonClassDao);
+		request = mock(HttpServletRequest.class);       
+		response =  new MockHttpServletResponse();
+		repo = Paths.get("src/test/resources/pdps");
+		engine = new StdEngine(repo);
+		ctrl = new PolicyController();
+		PolicyController.setPapEngine(engine);
+		controller.setPolicyController(ctrl);
+		logger.info("setUp: exit");
+	}
+	
+	@Test
+	public void testGetData() {
+		try {
+			controller.getData(request, response);
+			assertTrue(response.getContentAsString() != null && response.getContentAsString().contains("availableLoggingDatas"));
+		} catch (UnsupportedEncodingException e) {
+			logger.error("Exception Occured"+e);
+			fail();
+		}
+	}
+
+	@Test
+	public void testGetPAPStatusData() {
+		try {
+			controller.getPAPStatusData(request, response);
+			assertTrue(response.getContentAsString() != null && response.getContentAsString().contains("papTableDatas"));
+		} catch (UnsupportedEncodingException e) {
+			logger.error("Exception Occured"+e);
+			fail();
+		}
+	}
+
+	@Test
+	public void testGetPDPStatusData() {
+		try {
+			controller.getPDPStatusData(request, response);
+			assertTrue(response.getContentAsString() != null && response.getContentAsString().contains("pdpTableDatas"));
+		} catch (UnsupportedEncodingException e) {
+			logger.error("Exception Occured"+e);
+			fail();
+		}
+	}
+
+	@Test
+	public void testGetPolicyActivityData() {
+		try {
+			controller.getPolicyActivityData(request, response);
+			assertTrue(response.getContentAsString() != null && response.getContentAsString().contains("policyActivityTableDatas"));
+		} catch (UnsupportedEncodingException e) {
+			logger.error("Exception Occured"+e);
+			fail();
+		}
+	}
+
+	@Test
+	public void testGetSystemAlertData() {
+		try {
+			controller.getSystemAlertData(request, response);
+			assertTrue(response.getContentAsString() != null && response.getContentAsString().contains("systemAlertsTableDatas"));
+		} catch (UnsupportedEncodingException e) {
+			logger.error("Exception Occured"+e);
+			fail();
+		}
+	}
+}
+
diff --git a/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/PolicyRolesControllerTest.java b/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/PolicyRolesControllerTest.java
new file mode 100644
index 0000000..96b27b1
--- /dev/null
+++ b/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/PolicyRolesControllerTest.java
@@ -0,0 +1,106 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * POLICY-SDK-APP
+ * ================================================================================
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.policy.controller;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.BufferedReader;
+import java.io.StringReader;
+import java.io.UnsupportedEncodingException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.policy.common.logging.flexlogger.FlexLogger;
+import org.onap.policy.common.logging.flexlogger.Logger;
+import org.onap.policy.rest.dao.CommonClassDao;
+import org.onap.portalsdk.core.domain.User;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.springframework.mock.web.MockHttpServletResponse;
+
+public class PolicyRolesControllerTest {
+	private static Logger logger = FlexLogger.getLogger(PolicyRolesControllerTest.class);
+	private HttpServletRequest request = null;
+	private MockHttpServletResponse response = null;
+	private PolicyRolesController controller = null;	
+	private static CommonClassDao commonClassDao;
+	
+	@Before
+	public void setUp() throws Exception {
+		logger.info("setUp: Entering");
+		controller = new PolicyRolesController();
+		commonClassDao = Mockito.mock(CommonClassDao.class);
+		request = mock(HttpServletRequest.class);       
+		response =  new MockHttpServletResponse();
+		controller.setCommonClassDao(commonClassDao);
+		
+		HttpSession mockSession = mock(HttpSession.class);
+        User user = new User();
+		user.setOrgUserId("Test");
+		Mockito.when(mockSession.getAttribute(SystemProperties.getProperty("user_attribute_name"))).thenReturn(user);
+		Mockito.when(request.getSession(false)).thenReturn(mockSession);
+		
+		logger.info("setUp: exit");
+	}
+
+	@Test
+	public void testGetPolicyRolesEntityData() {
+	try {
+		controller.getPolicyRolesEntityData(request, response);
+		assertTrue(response.getContentAsString() != null && response.getContentAsString().contains("rolesDatas"));
+	} catch (UnsupportedEncodingException e) {
+		logger.error("Exception Occured"+e);
+		fail();
+	}
+}
+
+	@Test
+	public void testGetPolicyScopesEntityData() {
+		try {
+			controller.getPolicyScopesEntityData(request, response);
+			assertTrue(response.getContentAsString() != null && response.getContentAsString().contains("scopeDatas"));
+		} catch (UnsupportedEncodingException e) {
+			logger.error("Exception Occured"+e);
+			fail();
+		}
+	}
+
+	@Test
+	public void testSaveRolesEntityData() {
+			logger.info("PolicyRolesControllerTest: Entering");
+			String jsonString = "{\"editRoleData\": {\"id\": 1,\"loginId\": {\"userLoginId\" : \"test\", \"userName\" : \"test\"},\"role\":\"test\",\"scope\":[\"scope\"]}}";
+			try(BufferedReader br = new BufferedReader(new StringReader(jsonString))){
+				when(request.getReader()).thenReturn(br); 		    
+				controller.SaveRolesEntityData(request, response);
+				logger.info("response.getContentAsString(): " + response.getContentAsString());
+				assertTrue( response.getContentAsString() != null && response.getContentAsString().contains("rolesDatas"));
+			} catch (Exception e) {
+			fail("Exception: " + e);
+		}
+		logger.info("PolicyRolesControllerTest: exit");
+	}
+}
+
diff --git a/POLICY-SDK-APP/src/test/resources/pdps/default/xacml.pip.properties b/POLICY-SDK-APP/src/test/resources/pdps/default/xacml.pip.properties
new file mode 100644
index 0000000..ae3538a
--- /dev/null
+++ b/POLICY-SDK-APP/src/test/resources/pdps/default/xacml.pip.properties
@@ -0,0 +1,9 @@
+#
+#Thu Feb 15 10:13:45 EST 2018
+historydb.name=operationHistoryDB
+AAF.description=AAFEngine to communicate with AAF to take decisions
+historydb.issuer=org\:onap\:xacml\:guard\:historydb
+AAF.classname=org.onap.policy.xacml.std.pip.engines.aaf.AAFEngine
+AAF.name=AAFEngine
+historydb.classname=org.onap.policy.xacml.std.pip.engines.OperationHistoryEngine
+xacml.pip.engines=historydb,AAF
diff --git a/POLICY-SDK-APP/src/test/resources/pdps/default/xacml.policy.properties b/POLICY-SDK-APP/src/test/resources/pdps/default/xacml.policy.properties
new file mode 100644
index 0000000..7070690
--- /dev/null
+++ b/POLICY-SDK-APP/src/test/resources/pdps/default/xacml.policy.properties
@@ -0,0 +1,4 @@
+#
+#Thu Feb 15 10:13:45 EST 2018
+xacml.referencedPolicies=
+xacml.rootPolicies=
diff --git a/POLICY-SDK-APP/src/test/resources/pdps/xacml.properties b/POLICY-SDK-APP/src/test/resources/pdps/xacml.properties
new file mode 100644
index 0000000..cf8d29d
--- /dev/null
+++ b/POLICY-SDK-APP/src/test/resources/pdps/xacml.properties
@@ -0,0 +1,10 @@
+#
+#Wed Feb 21 11:54:45 EST 2018
+xacml.pap.groups.default=default
+xacml.pap.groups=default
+http\://localhost\:8082/pdp/.jmxport=
+default.name=default
+default.description=The default group where new PDP's are put.
+http\://localhost\:8082/pdp/.name=http\://localhost\:8082/pdp/
+http\://localhost\:8082/pdp/.description=Registered on first startup
+default.pdps=
