diff --git a/asdctool/pom.xml b/asdctool/pom.xml
index d754dec..3eef6cc 100644
--- a/asdctool/pom.xml
+++ b/asdctool/pom.xml
@@ -490,6 +490,12 @@
 			<groupId>io.netty</groupId>
 			<artifactId>netty-handler</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>org.powermock</groupId>
+			<artifactId>powermock-module-junit4</artifactId>
+			<version>2.0.2</version>
+			<scope>test</scope>
+		</dependency>
 	</dependencies>
 
 	<build>
diff --git a/asdctool/src/main/java/org/openecomp/sdc/asdctool/impl/validator/config/ValidationConfigManager.java b/asdctool/src/main/java/org/openecomp/sdc/asdctool/impl/validator/config/ValidationConfigManager.java
index 5630a2b..cc75dfc 100644
--- a/asdctool/src/main/java/org/openecomp/sdc/asdctool/impl/validator/config/ValidationConfigManager.java
+++ b/asdctool/src/main/java/org/openecomp/sdc/asdctool/impl/validator/config/ValidationConfigManager.java
@@ -3,13 +3,17 @@
  * SDC
  * ================================================================================
  * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (c) 2019 Samsung
  * ================================================================================
  * 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
- * 
+ *
+ *
+ *      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.
@@ -24,6 +28,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Properties;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -38,37 +43,40 @@
     private static String outputFullFilePath;
     private static String outputFilePath;
 
+    private ValidationConfigManager() {
+    }
+
     public static String getOutputFullFilePath() {
         return outputFullFilePath;
     }
+
     public static String getOutputFilePath() {
         return outputFilePath;
     }
 
     public static void setOutputFullFilePath(String outputPath) {
-    	ValidationConfigManager.outputFilePath = outputPath;
-        ValidationConfigManager.outputFullFilePath = outputPath+ "/reportOutput.txt";
+        ValidationConfigManager.outputFilePath = outputPath;
+        ValidationConfigManager.outputFullFilePath = outputPath + "/reportOutput.txt";
     }
 
-    
-
     public static String getCsvReportFilePath() {
         return csvReportFilePath;
     }
 
     public static void setCsvReportFilePath(String outputPath) {
-        ValidationConfigManager.csvReportFilePath = outputPath +"/csvSummary_"+System.currentTimeMillis()+".csv";
+        ValidationConfigManager.csvReportFilePath =
+            outputPath + "/csvSummary_" + System.currentTimeMillis() + ".csv";
     }
 
     private static String csvReportFilePath = "summary.csv";
 
-    public static Properties setValidationConfiguration(String path){
-        InputStream input = null;
+    public static Properties setValidationConfiguration(String path) {
+        InputStream input;
         try {
             input = new FileInputStream(path);
             prop.load(input);
         } catch (IOException ex) {
-            log.info("FileInputStream failed - " , ex);
+            log.info("FileInputStream failed - {}", ex);
         }
         return prop;
     }
diff --git a/asdctool/src/main/java/org/openecomp/sdc/asdctool/impl/validator/tasks/artifacts/ArtifactValidationUtils.java b/asdctool/src/main/java/org/openecomp/sdc/asdctool/impl/validator/tasks/artifacts/ArtifactValidationUtils.java
index 025e0b6..2e804cc 100644
--- a/asdctool/src/main/java/org/openecomp/sdc/asdctool/impl/validator/tasks/artifacts/ArtifactValidationUtils.java
+++ b/asdctool/src/main/java/org/openecomp/sdc/asdctool/impl/validator/tasks/artifacts/ArtifactValidationUtils.java
@@ -3,13 +3,14 @@
  * SDC
  * ================================================================================
  * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (c) 2019 Samsung
  * ================================================================================
  * 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.
@@ -20,7 +21,12 @@
 
 package org.openecomp.sdc.asdctool.impl.validator.tasks.artifacts;
 
-import fj.data.Either;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
 import org.openecomp.sdc.asdctool.impl.validator.utils.ReportManager;
 import org.openecomp.sdc.be.dao.cassandra.ArtifactCassandraDao;
 import org.openecomp.sdc.be.dao.cassandra.CassandraOperationStatus;
@@ -32,15 +38,18 @@
 import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.ToscaElement;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.TopologyTemplateOperation;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
+import org.openecomp.sdc.common.log.wrappers.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 
-import java.util.*;
+import fj.data.Either;
 
 /**
  * Created by chaya on 7/6/2017.
  */
 public class ArtifactValidationUtils {
 
+    private static final Logger logger = Logger.getLogger(ArtifactValidationUtils.class);
+
     private ArtifactCassandraDao artifactCassandraDao;
 
     private TopologyTemplateOperation topologyTemplateOperation;
@@ -55,10 +64,9 @@
     public ArtifactsVertexResult validateArtifactsAreInCassandra(GraphVertex vertex, String taskName, List<ArtifactDataDefinition> artifacts) {
         ArtifactsVertexResult result = new ArtifactsVertexResult(true);
         for(ArtifactDataDefinition artifact:artifacts) {
-            boolean isArtifactExist = isArtifcatInCassandra(artifact.getEsId());
+            boolean isArtifactExist = isArtifactInCassandra(artifact.getEsId());
             String status = isArtifactExist ? "Artifact " + artifact.getEsId() + " is in Cassandra" :
                     "Artifact " + artifact.getEsId() + " doesn't exist in Cassandra";
-
             ReportManager.writeReportLineToFile(status);
             if (!isArtifactExist) {
                 ReportManager.addFailedVertex(taskName, vertex.getUniqueId());
@@ -69,24 +77,20 @@
         return result;
     }
 
-    public boolean isArtifcatInCassandra(String uniueId) {
+    public boolean isArtifactInCassandra(String uniqueId) {
         Either<Long, CassandraOperationStatus> countOfArtifactsEither =
-                artifactCassandraDao.getCountOfArtifactById(uniueId);
+            artifactCassandraDao.getCountOfArtifactById(uniqueId);
         if (countOfArtifactsEither.isRight()) {
-            // print to console
-            System.out.print("Failed to retrieve artifact with id: "+uniueId+" from Cassandra" );
+            logger.debug("Failed to retrieve artifact with id: {} from Cassandra", uniqueId);
             return false;
         }
         Long count = countOfArtifactsEither.left().value();
-        if (count <1) {
-            return false;
-        }
-        return true;
+        return count >= 1;
     }
 
     public List<ArtifactDataDefinition> addRelevantArtifacts(Map<String, ArtifactDataDefinition> artifactsMap) {
         List<ArtifactDataDefinition> artifacts = new ArrayList<>();
-        Optional.ofNullable(artifactsMap).orElse(Collections.emptyMap()).forEach( (key, dataDef) -> {
+        Optional.ofNullable(artifactsMap).orElse(Collections.emptyMap()).forEach((key, dataDef) -> {
             if (dataDef.getEsId() != null && !dataDef.getEsId().isEmpty()) {
                 artifacts.add(dataDef);
             }
@@ -119,15 +123,13 @@
         allArtifacts.addAll(addRelevantArtifacts(apiArtifacts));
 
         if (instanceArtifacts != null) {
-            instanceArtifacts.forEach((key, artifactMap) -> {
-                allArtifacts.addAll(addRelevantArtifacts(artifactMap.getMapToscaDataDefinition()));
-            });
+            instanceArtifacts.forEach((key, artifactMap) ->
+                    allArtifacts.addAll(addRelevantArtifacts(artifactMap.getMapToscaDataDefinition())));
         }
 
         if (instanceDeploymentArtifacts != null) {
-            instanceDeploymentArtifacts.forEach((key, artifactMap) -> {
-                allArtifacts.addAll(addRelevantArtifacts(artifactMap.getMapToscaDataDefinition()));
-            });
+            instanceDeploymentArtifacts.forEach((key, artifactMap) ->
+                    allArtifacts.addAll(addRelevantArtifacts(artifactMap.getMapToscaDataDefinition())));
         }
 
         return validateArtifactsAreInCassandra(vertex, taskName, allArtifacts);
diff --git a/asdctool/src/test/java/org/openecomp/sdc/asdctool/impl/validator/config/ValidationConfigManagerTest.java b/asdctool/src/test/java/org/openecomp/sdc/asdctool/impl/validator/config/ValidationConfigManagerTest.java
index 2b169e9..4813cff 100644
--- a/asdctool/src/test/java/org/openecomp/sdc/asdctool/impl/validator/config/ValidationConfigManagerTest.java
+++ b/asdctool/src/test/java/org/openecomp/sdc/asdctool/impl/validator/config/ValidationConfigManagerTest.java
@@ -21,77 +21,71 @@
 package org.openecomp.sdc.asdctool.impl.validator.config;
 
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.openecomp.sdc.asdctool.impl.validator.utils.ReportManager;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
 
 import java.util.Properties;
 
-
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ReportManager.class})
 public class ValidationConfigManagerTest {
 
-	private ValidationConfigManager createTestSubject() {
-		return new ValidationConfigManager();
-	}
+    @Test
+    public void testGetOutputFilePath() {
+        String result;
 
-	
-	@Test
-	public void testGetOutputFilePath() {
-		String result;
+        // default test
+        result = ValidationConfigManager.getOutputFilePath();
+    }
 
-		// default test
-		result = ValidationConfigManager.getOutputFilePath();
-	}
-	
-	@Test
-	public void testGetCsvReportFilePath() {
-		String result;
+    @Test
+    public void testGetCsvReportFilePath() {
+        String result;
 
-		// default test
-		result = ValidationConfigManager.getCsvReportFilePath();
-	}
+        // default test
+        result = ValidationConfigManager.getCsvReportFilePath();
+    }
 
-	
-	@Test
-	public void testSetCsvReportFilePath() {
-		String outputPath = "";
+    @Test
+    public void testSetCsvReportFilePath() {
+        String outputPath = "";
 
-		// default test
-		ValidationConfigManager.setCsvReportFilePath(outputPath);
-	}
+        // default test
+        ValidationConfigManager.setCsvReportFilePath(outputPath);
+    }
 
-	
-	@Test
-	public void testSetValidationConfiguration() {
-		String path = "";
-		Properties result;
+    @Test
+    public void testSetValidationConfiguration() {
+        String path = "";
+        Properties result;
 
-		// default test
-		result = ValidationConfigManager.setValidationConfiguration(path);
-	}
+        // default test
+        result = ValidationConfigManager.setValidationConfiguration(path);
+    }
 
-	
-	@Test
-	public void testGetValidationConfiguration() {
-		Properties result;
+    @Test
+    public void testGetValidationConfiguration() {
+        Properties result;
 
-		// default test
-		result = ValidationConfigManager.getValidationConfiguration();
-	}
+        // default test
+        result = ValidationConfigManager.getValidationConfiguration();
+    }
 
+    @Test
+    public void testGetOutputFullFilePath() throws Exception {
+        String result;
 
-	@Test
-	public void testGetOutputFullFilePath() throws Exception {
-	String result;
-	
-	// default test
-	result=ValidationConfigManager.getOutputFullFilePath();
-	}
+        // default test
+        result = ValidationConfigManager.getOutputFullFilePath();
+    }
 
+    @Test
+    public void testSetOutputFullFilePath() throws Exception {
+        String outputPath = "";
 
-	@Test
-	public void testSetOutputFullFilePath() throws Exception {
-	String outputPath = "";
-	
-	
-	// default test
-	ValidationConfigManager.setOutputFullFilePath(outputPath);
-	}
+        // default test
+        ValidationConfigManager.setOutputFullFilePath(outputPath);
+    }
 }
diff --git a/asdctool/src/test/java/org/openecomp/sdc/asdctool/impl/validator/tasks/artifacts/ArtifactValidationUtilsTest.java b/asdctool/src/test/java/org/openecomp/sdc/asdctool/impl/validator/tasks/artifacts/ArtifactValidationUtilsTest.java
index 5053f4b..2dca89f 100644
--- a/asdctool/src/test/java/org/openecomp/sdc/asdctool/impl/validator/tasks/artifacts/ArtifactValidationUtilsTest.java
+++ b/asdctool/src/test/java/org/openecomp/sdc/asdctool/impl/validator/tasks/artifacts/ArtifactValidationUtilsTest.java
@@ -3,13 +3,14 @@
  * SDC
  * ================================================================================
  * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (c) 2019 Samsung
  * ================================================================================
  * 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.
@@ -20,69 +21,209 @@
 
 package org.openecomp.sdc.asdctool.impl.validator.tasks.artifacts;
 
-import static org.mockito.Mockito.mock;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
-import org.junit.Test;
-import org.openecomp.sdc.be.dao.cassandra.ArtifactCassandraDao;
-import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
-import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
 
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+
+import org.mockito.junit.MockitoJUnitRunner;
+import org.openecomp.sdc.asdctool.impl.validator.config.ValidationConfigManager;
+import org.openecomp.sdc.asdctool.impl.validator.utils.ReportManager;
+import org.openecomp.sdc.be.dao.cassandra.ArtifactCassandraDao;
+import org.openecomp.sdc.be.dao.cassandra.CassandraOperationStatus;
+
+import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
+import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.MapArtifactDataDefinition;
+import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.TopologyTemplate;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.TopologyTemplateOperation;
+import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 
+import fj.data.Either;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.powermock.modules.junit4.PowerMockRunnerDelegate;
+
+@RunWith(PowerMockRunner.class)
+@PowerMockRunnerDelegate(MockitoJUnitRunner.class)
+@PrepareForTest({ReportManager.class})
 public class ArtifactValidationUtilsTest {
+    
+    @Mock
+    private ArtifactCassandraDao artifactCassandraDao;
+    @Mock
+    private TopologyTemplateOperation topologyTemplateOperation;
+    @InjectMocks
+    private ArtifactValidationUtils testSubject;
 
-	private ArtifactValidationUtils createTestSubject() {
-		ArtifactCassandraDao artifactCassandraDao = mock(ArtifactCassandraDao.class);
-		TopologyTemplateOperation topologyTemplateOperation = mock(TopologyTemplateOperation.class);
-		return new ArtifactValidationUtils(artifactCassandraDao, topologyTemplateOperation);
-	}
+    @Mock
+    private GraphVertex vertex;
+    @Mock
+    private MapArtifactDataDefinition mapToscaDataDefinition;
+    @Mock
+    private ArtifactDataDefinition artifactDataDefinition;
+    @Mock
+    private ArtifactDataDefinition artifactDataDefinitionNotInCassandra;
+    @Mock
+    private ArtifactDataDefinition artifactDataDefinitionDummy;
+    @Mock
+    private TopologyTemplate topologyTemplate;
 
-	@Test(expected=NullPointerException.class)
-	public void testValidateArtifactsAreInCassandra() throws Exception {
-		ArtifactValidationUtils testSubject;
-		GraphVertex vertex = null;
-		String taskName = "";
-		List<ArtifactDataDefinition> artifacts = null;
-		ArtifactsVertexResult result;
+    private static final String ES_ID = "testEsInCassandra";
+    private static final String ES_ID_NOT_IN_CASS = "testEsNotInCassandra";
+    private static final String TASK_NAME = "testTaskName";
+    private static final String UNIQUE_ID = "4321";
+    private static final String UNIQUE_ID_VERTEX = "321";
 
-		// default test
-		testSubject = createTestSubject();
-		result = testSubject.validateArtifactsAreInCassandra(vertex, taskName, artifacts);
-	}
+    public void initReportManager() {
+        String resourcePath = new File(Objects
+            .requireNonNull(ArtifactValidationUtilsTest.class.getClassLoader().getResource(""))
+            .getFile()).getAbsolutePath();
+        ValidationConfigManager.setOutputFullFilePath(resourcePath);
+        new ReportManager();
+    }
 
-	@Test(expected=NullPointerException.class)
-	public void testIsArtifcatInCassandra() throws Exception {
-		ArtifactValidationUtils testSubject;
-		String uniueId = "";
-		boolean result;
+    @Before
+    public void setup() {
+        initReportManager();
+        when(artifactCassandraDao.getCountOfArtifactById(ES_ID)).thenReturn(Either.left(1L));
+        when(artifactCassandraDao.getCountOfArtifactById(ES_ID_NOT_IN_CASS))
+            .thenReturn(Either.right(CassandraOperationStatus.NOT_FOUND));
 
-		// default test
-		testSubject = createTestSubject();
-		result = testSubject.isArtifcatInCassandra(uniueId);
-	}
+        when(artifactDataDefinition.getEsId()).thenReturn(ES_ID);
+        when(artifactDataDefinitionNotInCassandra.getEsId()).thenReturn(ES_ID_NOT_IN_CASS);
 
-	@Test
-	public void testAddRelevantArtifacts() throws Exception {
-		ArtifactValidationUtils testSubject;
-		Map<String, ArtifactDataDefinition> artifactsMap = null;
-		List<ArtifactDataDefinition> result;
+        when(artifactDataDefinitionNotInCassandra.getUniqueId()).thenReturn(UNIQUE_ID);
+        when(vertex.getUniqueId()).thenReturn(UNIQUE_ID_VERTEX);
+    }
 
-		// default test
-		testSubject = createTestSubject();
-		result = testSubject.addRelevantArtifacts(artifactsMap);
-	}
+    @Test
+    public void testValidateArtifactsAreInCassandra() {
+        // given
+        List<ArtifactDataDefinition> artifacts = new ArrayList<>();
+        artifacts.add(artifactDataDefinition);
 
-	@Test(expected=NullPointerException.class)
-	public void testValidateTopologyTemplateArtifacts() throws Exception {
-		ArtifactValidationUtils testSubject;
-		GraphVertex vertex = null;
-		String taskName = "";
-		ArtifactsVertexResult result;
+        // when
+        ArtifactsVertexResult result =
+            testSubject.validateArtifactsAreInCassandra(vertex, TASK_NAME, artifacts);
 
-		// default test
-		testSubject = createTestSubject();
-		result = testSubject.validateTopologyTemplateArtifacts(vertex, taskName);
-	}
+        // then
+        assertTrue(result.getStatus());
+        assertEquals(0, result.notFoundArtifacts.size());
+    }
+
+    @Test
+    public void testValidateArtifactsNotInCassandra() {
+        // given
+        List<ArtifactDataDefinition> artifacts = new ArrayList<>();
+        artifacts.add(artifactDataDefinition);
+        artifacts.add(artifactDataDefinitionNotInCassandra);
+
+        // when
+        ArtifactsVertexResult result =
+            testSubject.validateArtifactsAreInCassandra(vertex, TASK_NAME, artifacts);
+
+        // then
+        assertFalse(result.getStatus());
+        assertEquals(1, result.notFoundArtifacts.size());
+        assertEquals(UNIQUE_ID, result.notFoundArtifacts.iterator().next());
+    }
+
+    @Test
+    public void testIsArtifactsInCassandra() {
+        // when
+        boolean notInCass = testSubject.isArtifactInCassandra(ES_ID_NOT_IN_CASS);
+        boolean inCass = testSubject.isArtifactInCassandra(ES_ID);
+
+        // then
+        assertFalse(notInCass);
+        assertTrue(inCass);
+    }
+
+    @Test
+    public void testAddRelevantArtifacts() {
+        // given
+        Map<String, ArtifactDataDefinition> artifactsMap = new HashMap<>();
+        artifactsMap.put(ES_ID_NOT_IN_CASS, artifactDataDefinitionNotInCassandra);
+        artifactsMap.put(ES_ID, artifactDataDefinition);
+
+        // when
+        List<ArtifactDataDefinition> result = testSubject.addRelevantArtifacts(artifactsMap);
+
+        // then
+        result.forEach(Assert::assertNotNull);
+    }
+
+    @Test
+    public void testAddRelevantArtifactsWithNullEsId() {
+        // given
+        Map<String, ArtifactDataDefinition> artifactsMap = new HashMap<>();
+        artifactsMap.put("", artifactDataDefinitionDummy);
+
+        // when
+        List<ArtifactDataDefinition> result = testSubject.addRelevantArtifacts(artifactsMap);
+
+        // then
+        assertEquals(0, result.size());
+    }
+
+    @Test
+    public void testValidateTopologyTemplateArtifacts() {
+        // given
+		Map<String, ArtifactDataDefinition> artifacts = new HashMap<>();
+		artifacts.put(ES_ID, artifactDataDefinition);
+
+		when(topologyTemplate.getDeploymentArtifacts()).thenReturn(artifacts);
+		when(topologyTemplate.getArtifacts()).thenReturn(artifacts);
+		when(topologyTemplate.getServiceApiArtifacts()).thenReturn(artifacts);
+
+		when(mapToscaDataDefinition.getMapToscaDataDefinition()).thenReturn(artifacts);
+		Map<String, MapArtifactDataDefinition> artifactsMap = new HashMap<>();
+		artifactsMap.put(ES_ID, mapToscaDataDefinition);
+
+		when(topologyTemplate.getInstanceArtifacts()).thenReturn(artifactsMap);
+		when(topologyTemplate.getInstDeploymentArtifacts()).thenReturn(artifactsMap);
+
+        when(topologyTemplateOperation.getToscaElement(eq(vertex.getUniqueId()), any()))
+            .thenReturn(Either.left(topologyTemplate));
+
+        // when
+        ArtifactsVertexResult result =
+            testSubject.validateTopologyTemplateArtifacts(vertex, TASK_NAME);
+
+        // then
+		assertTrue(result.getStatus());
+		assertEquals(0, result.notFoundArtifacts.size());
+    }
+
+    @Test
+    public void testValidateTopologyTemplateArtifactsNotFoundToscaElement() {
+        // given
+        when(topologyTemplateOperation.getToscaElement(eq(vertex.getUniqueId()), any()))
+            .thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
+
+        // when
+        ArtifactsVertexResult result =
+            testSubject.validateTopologyTemplateArtifacts(vertex, TASK_NAME);
+
+        // then
+        assertFalse(result.getStatus());
+    }
 }
diff --git a/asdctool/src/test/java/org/openecomp/sdc/asdctool/impl/validator/utils/ReportManagerTest.java b/asdctool/src/test/java/org/openecomp/sdc/asdctool/impl/validator/utils/ReportManagerTest.java
index 7f67334..1da3d6d 100644
--- a/asdctool/src/test/java/org/openecomp/sdc/asdctool/impl/validator/utils/ReportManagerTest.java
+++ b/asdctool/src/test/java/org/openecomp/sdc/asdctool/impl/validator/utils/ReportManagerTest.java
@@ -20,11 +20,16 @@
 
 package org.openecomp.sdc.asdctool.impl.validator.utils;
 
-import org.junit.Test;
-import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
-
 import java.util.Set;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ReportManager.class})
 public class ReportManagerTest {
 
 	@Test
