diff --git a/src/test/java/org/onosproject/yangutils/parser/parseutils/ListenerErrorMessageConstructionTest.java b/src/test/java/org/onosproject/yangutils/parser/parseutils/ListenerErrorMessageConstructionTest.java
new file mode 100644
index 0000000..7cbc7f6
--- /dev/null
+++ b/src/test/java/org/onosproject/yangutils/parser/parseutils/ListenerErrorMessageConstructionTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * 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.yangutils.parser.parseutils;
+
+import org.junit.Test;
+import org.onosproject.yangutils.parser.ParsableDataType;
+import org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation;
+import org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction;
+import org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType;
+
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Test case for testing listener error message construction util.
+ */
+public class ListenerErrorMessageConstructionTest {
+
+    /**
+     * Checks for error message construction with parsable data type name.
+     */
+    @Test
+    public void checkErrorMsgConstructionWithName() {
+
+        // Create an test error message
+        String testErrorMessage = ListenerErrorMessageConstruction
+                .constructListenerErrorMessage(ListenerErrorType.INVALID_HOLDER, ParsableDataType.CONTACT_DATA,
+                                               "Test Instance", ListenerErrorLocation.ENTRY);
+
+        // Check message.
+        assertThat(testErrorMessage, is("Internal parser error detected: Invalid holder for contact "
+                + "\"Test Instance\" before processing."));
+    }
+
+    /**
+     * Checks for error message construction without parsable data type name.
+     */
+    @Test
+    public void checkErrorMsgConstructionWithoutName() {
+
+        // Create an test error message
+        String testErrorMessage = ListenerErrorMessageConstruction
+                .constructListenerErrorMessage(ListenerErrorType.INVALID_HOLDER, ParsableDataType.CONTACT_DATA,
+                                               "Test Instance", ListenerErrorLocation.ENTRY);
+
+        // Check message.
+        assertThat(testErrorMessage,
+                   is("Internal parser error detected: Invalid holder for contact \"Test Instance\""
+                           + " before processing."));
+    }
+
+    /**
+     * Checks for extended error message construction with parsable data type name.
+     */
+    @Test
+    public void checkExtendedErrorMsgConstructionWithName() {
+
+        // Create an test error message
+        String testErrorMessage = ListenerErrorMessageConstruction
+                .constructExtendedListenerErrorMessage(ListenerErrorType.INVALID_HOLDER,
+                                                       ParsableDataType.CONTACT_DATA, "Test Instance",
+                                                       ListenerErrorLocation.ENTRY, "Extended Information");
+
+        // Check message.
+        assertThat(testErrorMessage,
+                   is("Internal parser error detected: Invalid holder for contact \"Test Instance\""
+                           + " before processing.\n" + "Error Information: Extended Information"));
+    }
+
+    /**
+     * Checks for extended error message construction without parsable data type name.
+     */
+    @Test
+    public void checkExtendedErrorMsgConstructionWithoutName() {
+
+        // Create an test error message
+        String testErrorMessage = ListenerErrorMessageConstruction
+                .constructExtendedListenerErrorMessage(ListenerErrorType.INVALID_HOLDER,
+                                                       ParsableDataType.CONTACT_DATA, "",
+                                                       ListenerErrorLocation.ENTRY, "Extended Information");
+
+        // Check message.
+        assertThat(testErrorMessage, is("Internal parser error detected: Invalid holder for contact"
+                + " before processing.\n" + "Error Information: Extended Information"));
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/org/onosproject/yangutils/parser/parseutils/ListenerValidationTest.java b/src/test/java/org/onosproject/yangutils/parser/parseutils/ListenerValidationTest.java
index c047f2b..85eb48d 100644
--- a/src/test/java/org/onosproject/yangutils/parser/parseutils/ListenerValidationTest.java
+++ b/src/test/java/org/onosproject/yangutils/parser/parseutils/ListenerValidationTest.java
@@ -16,74 +16,54 @@
 
 package org.onosproject.yangutils.parser.parseutils;
 
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.ExpectedException;
 import org.onosproject.yangutils.datamodel.YangRevision;
+import org.onosproject.yangutils.parser.ParsableDataType;
+import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
-import org.onosproject.yangutils.parser.impl.parserutils.ListenerError;
+import org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation;
+import org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction;
+import org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType;
 import org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation;
 
-import static org.hamcrest.core.Is.is;
-import static org.junit.Assert.assertThat;
-
 /**
  * Test case for testing listener validation util.
  */
 public class ListenerValidationTest {
 
-    /**
-     * This test case checks in case error pre-exists, listener validate
-     * function returns true.
-     */
-    @Test
-    public void listenerValidationErrorExists() {
-
-        // Create an test error.
-        ListenerError testError = new ListenerError();
-        testError.setErrorFlag(true);
-        testError.setErrorMsg("Test Error");
-
-        // Create test walker and assign test error to it.
-        TreeWalkListener testWalker = new TreeWalkListener();
-        testWalker.setErrorInformation(testError);
-
-        // Create a temporary node of parsable.
-        YangRevision tmpNode = new YangRevision();
-        testWalker.getParsedDataStack().push(tmpNode);
-
-        boolean errorFlag = ListenerValidation.preValidation(testWalker, "ErrorTest");
-
-        /**
-         * Check for the values set in syntax error function. If not set properly
-         * report an assert.
-         */
-        assertThat(errorFlag, is(true));
-    }
+    @Rule
+    public ExpectedException thrown = ExpectedException.none();
 
     /**
-     * This test case checks in case parsable stack is empty, listener validate
-     * function returns true.
+     * Checks for exception in case parsable stack is empty while validating for
+     * not empty scenario.
      */
     @Test
-    public void listenerValidationEmptyStack() {
+    public void validateStackIsNotEmptyForEmptyStack() {
+
+        String expectedError = ListenerErrorMessageConstruction
+                .constructListenerErrorMessage(ListenerErrorType.MISSING_HOLDER, ParsableDataType.YANGBASE_DATA, "",
+                        ListenerErrorLocation.EXIT);
+
+        // Get the exception occurred during parsing.
+        thrown.expect(ParserException.class);
+        thrown.expectMessage(expectedError);
 
         // Create test walker and assign test error to it.
         TreeWalkListener testWalker = new TreeWalkListener();
 
-        boolean errorFlag = ListenerValidation.preValidation(testWalker, "ErrorTest");
-
-        /**
-         * Check for the values set in syntax error function. If not set properly
-         * report an assert.
-         */
-        assertThat(errorFlag, is(true));
+        ListenerValidation.checkStackIsNotEmpty(testWalker, ListenerErrorType.MISSING_HOLDER,
+                ParsableDataType.YANGBASE_DATA, "", ListenerErrorLocation.EXIT);
     }
 
     /**
-     * This test case checks in case of error doesn't pre-exists and stack is,
-     * non empty, listener validate function returns false.
+     * Checks if there is no exception in case parsable stack is not empty while validating
+     * for not empty scenario.
      */
     @Test
-    public void listenerValidationNoErrorNotExists() {
+    public void validateStackIsNotEmptyForNonEmptyStack() {
 
         // Create test walker and assign test error to it.
         TreeWalkListener testWalker = new TreeWalkListener();
@@ -92,12 +72,47 @@
         YangRevision tmpNode = new YangRevision();
         testWalker.getParsedDataStack().push(tmpNode);
 
-        boolean errorFlag = ListenerValidation.preValidation(testWalker, "ErrorTest");
+        ListenerValidation.checkStackIsNotEmpty(testWalker, ListenerErrorType.MISSING_HOLDER,
+                                                ParsableDataType.YANGBASE_DATA, "", ListenerErrorLocation.EXIT);
+    }
 
-        /**
-         * Check for the values set in syntax error function. If not set properly
-         * report an assert.
-         */
-        assertThat(errorFlag, is(false));
+    /**
+     * Checks for exception in case parsable stack is not empty while validating
+     * for empty scenario.
+     */
+    @Test
+    public void validateStackIsEmptyForNonEmptyStack() {
+
+        String expectedError = ListenerErrorMessageConstruction
+                .constructListenerErrorMessage(ListenerErrorType.MISSING_HOLDER, ParsableDataType.YANGBASE_DATA, "",
+                        ListenerErrorLocation.EXIT);
+
+        // Get the exception occurred during parsing.
+        thrown.expect(ParserException.class);
+        thrown.expectMessage(expectedError);
+
+        // Create test walker and assign test error to it.
+        TreeWalkListener testWalker = new TreeWalkListener();
+
+        // Create a temporary node of parsable.
+        YangRevision tmpNode = new YangRevision();
+        testWalker.getParsedDataStack().push(tmpNode);
+
+        ListenerValidation.checkStackIsEmpty(testWalker, ListenerErrorType.MISSING_HOLDER,
+                                             ParsableDataType.YANGBASE_DATA, "", ListenerErrorLocation.EXIT);
+    }
+
+    /**
+     * Checks if there is no exception in case parsable stack is empty while validating
+     * for empty scenario.
+     */
+    @Test
+    public void validateStackIsEmptyForEmptyStack() {
+
+        // Create test walker and assign test error to it.
+        TreeWalkListener testWalker = new TreeWalkListener();
+
+        ListenerValidation.checkStackIsEmpty(testWalker, ListenerErrorType.MISSING_HOLDER,
+                                             ParsableDataType.YANGBASE_DATA, "", ListenerErrorLocation.EXIT);
     }
 }
\ No newline at end of file
diff --git a/src/test/java/org/onosproject/yangutils/parser/parseutils/ParseTreeErrorListenerTest.java b/src/test/java/org/onosproject/yangutils/parser/parseutils/ParseTreeErrorListenerTest.java
index f91797e..a45ed72 100644
--- a/src/test/java/org/onosproject/yangutils/parser/parseutils/ParseTreeErrorListenerTest.java
+++ b/src/test/java/org/onosproject/yangutils/parser/parseutils/ParseTreeErrorListenerTest.java
@@ -14,29 +14,26 @@
  * limitations under the License.
  */
 
-package org.onosproject.yangutils.parser.impl.parseutils;
+package org.onosproject.yangutils.parser.parseutils;
 
 import org.antlr.v4.runtime.ANTLRFileStream;
 import org.antlr.v4.runtime.ANTLRInputStream;
 import org.antlr.v4.runtime.CommonTokenStream;
 import org.antlr.v4.runtime.tree.ParseTree;
-import org.junit.After;
-import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.ExpectedException;
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangLexer;
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
+import org.onosproject.yangutils.parser.impl.CustomExceptionMatcher;
 import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
 import org.onosproject.yangutils.parser.impl.parserutils.ParseTreeErrorListener;
 
 import java.io.BufferedWriter;
 import java.io.File;
-import java.io.FileWriter;
 import java.io.IOException;
 
-import static org.hamcrest.core.Is.is;
-import static org.junit.Assert.assertThat;
-
 /**
  * Test case for testing parse tree error listener.
  */
@@ -46,31 +43,16 @@
     File file;
     BufferedWriter out;
 
-    @Before
-    public void setUp() throws Exception {
-        file = new File("demo.yang");
-        out = new BufferedWriter(new FileWriter(file));
-    }
-    @After
-    public void tearDown() throws Exception {
-        file.delete();
-    }
+    @Rule
+    public ExpectedException thrown = ExpectedException.none();
 
     /**
-     * This test case checks whether the error received from parser is correctly
-     * handled.
+     * Checks that no exception is generated for YANG file with valid syntax.
      */
     @Test
-    public void syntaxErrorValidationTest() throws IOException {
+    public void checkValidYangFileForNoSyntaxError() throws IOException {
 
-        out.write("module ONOS {\n");
-        out.write("yang-version 1\n");
-        out.write("namespace urn:ietf:params:xml:ns:yang:ietf-ospf;\n");
-        out.write("prefix On;\n");
-        out.write("}\n");
-        out.close();
-
-        ANTLRInputStream input = new ANTLRFileStream("demo.yang");
+        ANTLRInputStream input = new ANTLRFileStream("src/test/resources/YangFileWithoutSyntaxError.yang");
 
         // Create a lexer that feeds off of input char stream.
         GeneratedYangLexer lexer = new GeneratedYangLexer(input);
@@ -86,15 +68,34 @@
         parser.addErrorListener(parseTreeErrorListener);
         // Begin parsing YANG file and generate parse tree.
         ParseTree tree = parser.yangfile();
-        // Get the exception occurred during parsing.
-        ParserException parserException = parseTreeErrorListener.getParserException();
+    }
 
-        /**
-         * Check for the values set in syntax error function. If not set properly
-         * report an assert.
-         */
-        assertThat(parseTreeErrorListener.isExceptionFlag(), is(true));
-        assertThat(parserException.getLineNumber(), is(3));
-        assertThat(parserException.getCharPositionInLine(), is(0));
+    /**
+     * Checks that exception is generated for YANG file with invalid syntax.
+     */
+    @Test
+    public void checkInvalidYangFileForSyntaxError() throws IOException {
+
+        // Get the exception occurred during parsing.
+        thrown.expect(ParserException.class);
+        thrown.expect(CustomExceptionMatcher.errorLocation(3, 0));
+        thrown.expectMessage("no viable alternative at input 'yang-version 1\\nnamespace'");
+
+        ANTLRInputStream input = new ANTLRFileStream("src/test/resources/YangFileWithSyntaxError.yang");
+
+        // Create a lexer that feeds off of input char stream.
+        GeneratedYangLexer lexer = new GeneratedYangLexer(input);
+        // Create a buffer of tokens pulled from the lexer.
+        CommonTokenStream tokens = new CommonTokenStream(lexer);
+        // Create a parser that feeds off the tokens buffer.
+        GeneratedYangParser parser = new GeneratedYangParser(tokens);
+        // Remove console error listener.
+        parser.removeErrorListeners();
+        // Create instance of customized error listener.
+        ParseTreeErrorListener parseTreeErrorListener = new ParseTreeErrorListener();
+        // Add customized error listener to catch errors during parsing.
+        parser.addErrorListener(parseTreeErrorListener);
+        // Begin parsing YANG file and generate parse tree.
+        ParseTree tree = parser.yangfile();
     }
 }
\ No newline at end of file
