diff --git a/phosphor-regulators/test/exception_utils_tests.cpp b/phosphor-regulators/test/exception_utils_tests.cpp
new file mode 100644
index 0000000..6d0c4cc
--- /dev/null
+++ b/phosphor-regulators/test/exception_utils_tests.cpp
@@ -0,0 +1,149 @@
+/**
+ * Copyright © 2020 IBM Corporation
+ *
+ * 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.
+ */
+#include "exception_utils.hpp"
+#include "journal.hpp"
+#include "mock_journal.hpp"
+
+#include <exception>
+#include <stdexcept>
+#include <string>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+using namespace phosphor::power::regulators;
+
+TEST(ExceptionUtilsTests, GetMessages)
+{
+    try
+    {
+        try
+        {
+            throw std::invalid_argument{"JSON element is not an array"};
+        }
+        catch (...)
+        {
+            std::throw_with_nested(
+                std::logic_error{"Unable to parse config file"});
+        }
+    }
+    catch (const std::exception& e)
+    {
+        std::vector<std::string> messages = exception_utils::getMessages(e);
+        EXPECT_EQ(messages.size(), 2);
+        EXPECT_EQ(messages[0], "JSON element is not an array");
+        EXPECT_EQ(messages[1], "Unable to parse config file");
+    }
+}
+
+TEST(ExceptionUtilsTests, Log)
+{
+    try
+    {
+        try
+        {
+            throw std::invalid_argument{"JSON element is not an array"};
+        }
+        catch (...)
+        {
+            std::throw_with_nested(
+                std::logic_error{"Unable to parse config file"});
+        }
+    }
+    catch (const std::exception& e)
+    {
+        journal::clear();
+        exception_utils::log(e);
+        const std::vector<std::string>& messages = journal::getErrMessages();
+        EXPECT_EQ(messages.size(), 2);
+        EXPECT_EQ(messages[0], "JSON element is not an array");
+        EXPECT_EQ(messages[1], "Unable to parse config file");
+    }
+}
+
+// Test for getMessages() function in the internal namespace
+TEST(ExceptionUtilsTests, GetMessagesInternal)
+{
+    // Test where exception is not nested
+    {
+        std::invalid_argument e{"JSON element is not an array"};
+        std::vector<std::string> messages{};
+        exception_utils::internal::getMessages(e, messages);
+        EXPECT_EQ(messages.size(), 1);
+        EXPECT_EQ(messages[0], "JSON element is not an array");
+    }
+
+    // Test where exception is nested
+    try
+    {
+        try
+        {
+            try
+            {
+                throw std::invalid_argument{"JSON element is not an array"};
+            }
+            catch (...)
+            {
+                std::throw_with_nested(
+                    std::logic_error{"Unable to parse config file"});
+            }
+        }
+        catch (...)
+        {
+            std::throw_with_nested(
+                std::runtime_error{"Unable to configure regulators"});
+        }
+    }
+    catch (const std::exception& e)
+    {
+        std::vector<std::string> messages{};
+        exception_utils::internal::getMessages(e, messages);
+        EXPECT_EQ(messages.size(), 3);
+        EXPECT_EQ(messages[0], "JSON element is not an array");
+        EXPECT_EQ(messages[1], "Unable to parse config file");
+        EXPECT_EQ(messages[2], "Unable to configure regulators");
+    }
+
+    // Test where nested exception is not a child of std::exception
+    try
+    {
+        try
+        {
+            try
+            {
+                throw "JSON element is not an array";
+            }
+            catch (...)
+            {
+                std::throw_with_nested(
+                    std::logic_error{"Unable to parse config file"});
+            }
+        }
+        catch (...)
+        {
+            std::throw_with_nested(
+                std::runtime_error{"Unable to configure regulators"});
+        }
+    }
+    catch (const std::exception& e)
+    {
+        std::vector<std::string> messages{};
+        exception_utils::internal::getMessages(e, messages);
+        EXPECT_EQ(messages.size(), 2);
+        EXPECT_EQ(messages[0], "Unable to parse config file");
+        EXPECT_EQ(messages[1], "Unable to configure regulators");
+    }
+}
