diff --git a/test/mock_syscall.cpp b/test/mock_syscall.cpp
index e481afd..bf68d47 100644
--- a/test/mock_syscall.cpp
+++ b/test/mock_syscall.cpp
@@ -1,4 +1,5 @@
-#include "system_queries.hpp"
+#include "mock_syscall.hpp"
+
 #include "util.hpp"
 
 #include <arpa/inet.h>
@@ -31,26 +32,28 @@
 std::map<std::string, InterfaceInfo> mock_if;
 std::map<int, std::string> mock_if_indextoname;
 
-void mock_clear()
+void phosphor::network::system::mock_clear()
 {
     mock_rtnetlinks.clear();
     mock_if.clear();
     mock_if_indextoname.clear();
 }
 
-void mock_addIF(const std::string& name, unsigned idx, unsigned flags,
-                std::optional<ether_addr> mac, std::optional<unsigned> mtu)
+void phosphor::network::system::mock_addIF(const InterfaceInfo& info)
 {
-    if (idx == 0)
+    if (info.idx == 0)
     {
         throw std::invalid_argument("Bad interface index");
     }
-
-    mock_if.emplace(
-        name,
-        InterfaceInfo{
-            .idx = idx, .flags = flags, .name = name, .mac = mac, .mtu = mtu});
-    mock_if_indextoname.emplace(idx, name);
+    for (const auto& [_, iinfo] : mock_if)
+    {
+        if (iinfo.idx == info.idx || iinfo.name == info.name)
+        {
+            throw std::invalid_argument("Interface already exists");
+        }
+    }
+    mock_if.emplace(info.name.value(), info);
+    mock_if_indextoname.emplace(info.idx, info.name.value());
 }
 
 void validateMsgHdr(const struct msghdr* msg)
diff --git a/test/mock_syscall.hpp b/test/mock_syscall.hpp
index 39c3986..4b0cb20 100644
--- a/test/mock_syscall.hpp
+++ b/test/mock_syscall.hpp
@@ -1,19 +1,11 @@
 #pragma once
-#include <net/ethernet.h>
+#include "system_queries.hpp"
 
-#include <optional>
-#include <string>
-
-/** @brief Clears out the interfaces and IPs configured for mocking
- */
+namespace phosphor::network::system
+{
+/** @brief Clears out the interfaces and IPs configured for mocking */
 void mock_clear();
 
-/** @brief Adds an address string to index mapping and MAC mapping
- *
- *  @param[in] name - Interface name
- *  @param[in] idx  - Interface index
- *  @param[in] mac  - Interface MAC address
- */
-void mock_addIF(const std::string& name, unsigned idx, unsigned flags = 0,
-                std::optional<ether_addr> mac = std::nullopt,
-                std::optional<unsigned> mtu = std::nullopt);
+/** @brief Adds an interface definition to the mock system */
+void mock_addIF(const InterfaceInfo& info);
+} // namespace phosphor::network::system
diff --git a/test/test_ethernet_interface.cpp b/test/test_ethernet_interface.cpp
index e65d03c..654f45d 100644
--- a/test/test_ethernet_interface.cpp
+++ b/test/test_ethernet_interface.cpp
@@ -44,11 +44,11 @@
     static MockEthernetInterface makeInterface(sdbusplus::bus_t& bus,
                                                MockManager& manager)
     {
-        mock_clear();
-        mock_addIF("test0", /*idx=*/1);
-        return {bus, manager,
-                system::InterfaceInfo{.idx = 1, .flags = 0, .name = "test0"},
-                "/xyz/openbmc_test/network"sv, config::Parser()};
+        system::mock_clear();
+        system::InterfaceInfo info{.idx = 1, .flags = 0, .name = "test0"};
+        system::mock_addIF(info);
+        return {bus, manager, info, "/xyz/openbmc_test/network"sv,
+                config::Parser()};
     }
 
     int countIPObjects()
@@ -110,17 +110,16 @@
     EXPECT_EQ("", interface.macAddress());
     EXPECT_FALSE(interface.linkUp());
 
-    constexpr unsigned idx = 2;
     constexpr ether_addr mac{0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
     constexpr unsigned mtu = 150;
 
-    mock_addIF("test1", idx, IFF_RUNNING, mac, mtu);
-    MockEthernetInterface intf(bus, manager,
-                               system::InterfaceInfo{.idx = idx,
-                                                     .flags = IFF_RUNNING,
-                                                     .name = "test1",
-                                                     .mac = mac,
-                                                     .mtu = mtu},
+    system::InterfaceInfo info{.idx = 2,
+                               .flags = IFF_RUNNING,
+                               .name = "test1",
+                               .mac = mac,
+                               .mtu = mtu};
+    system::mock_addIF(info);
+    MockEthernetInterface intf(bus, manager, info,
                                "/xyz/openbmc_test/network"sv, config::Parser());
 
     EXPECT_EQ(mtu, intf.mtu());
diff --git a/test/test_netlink.cpp b/test/test_netlink.cpp
index 71be8e9..c5292a7 100644
--- a/test/test_netlink.cpp
+++ b/test/test_netlink.cpp
@@ -293,12 +293,13 @@
 class PerformRequest : public testing::Test
 {
   public:
-    void doLinkDump(size_t ifs)
+    void doLinkDump(unsigned ifs)
     {
-        mock_clear();
-        for (size_t i = 0; i < ifs; ++i)
+        system::mock_clear();
+        for (unsigned i = 0; i < ifs; ++i)
         {
-            mock_addIF(fmt::format("eth{}", i), /*idx=*/1 + i);
+            system::mock_addIF(system::InterfaceInfo{
+                .idx = i + 1u, .flags = 0, .name = fmt::format("eth{}", i)});
         }
 
         size_t cbCalls = 0;
diff --git a/test/test_network_manager.cpp b/test/test_network_manager.cpp
index 5298719..459bacf 100644
--- a/test/test_network_manager.cpp
+++ b/test/test_network_manager.cpp
@@ -28,6 +28,7 @@
         bus(sdbusplus::bus::new_default()),
         manager(bus, "/xyz/openbmc_test/abc", CaseTmpDir())
     {
+        system::mock_clear();
     }
 
     void createInterfaces()
@@ -39,17 +40,14 @@
 // getifaddrs will not return any interface
 TEST_F(TestNetworkManager, NoInterface)
 {
-    mock_clear();
     createInterfaces();
     EXPECT_TRUE(manager.getInterfaces().empty());
 }
 // getifaddrs returns single interface.
 TEST_F(TestNetworkManager, WithSingleInterface)
 {
-    mock_clear();
-
     // Adds the following ip in the getifaddrs list.
-    mock_addIF("igb1", /*idx=*/2);
+    system::mock_addIF({.idx = 2, .flags = 0, .name = "igb1"});
 
     // Now create the interfaces which will call the mocked getifaddrs
     // which returns the above interface detail.
@@ -60,10 +58,8 @@
 // getifaddrs returns two interfaces.
 TEST_F(TestNetworkManager, WithMultipleInterfaces)
 {
-    mock_clear();
-
-    mock_addIF("igb0", /*idx=*/1);
-    mock_addIF("igb1", /*idx=*/2);
+    system::mock_addIF({.idx = 1, .flags = 0, .name = "igb0"});
+    system::mock_addIF({.idx = 2, .flags = 0, .name = "igb1"});
 
     createInterfaces();
     EXPECT_THAT(manager.getInterfaces(),
diff --git a/test/test_vlan_interface.cpp b/test/test_vlan_interface.cpp
index c17bf97..d5b6989 100644
--- a/test/test_vlan_interface.cpp
+++ b/test/test_vlan_interface.cpp
@@ -41,11 +41,12 @@
     static EthernetInterface makeInterface(sdbusplus::bus_t& bus,
                                            MockManager& manager)
     {
-        mock_clear();
-        mock_addIF("test0", /*idx=*/1);
+        system::mock_clear();
+        system::InterfaceInfo info{.idx = 1, .flags = 0, .name = "test0"};
+        system::mock_addIF(info);
         return {bus,
                 manager,
-                system::InterfaceInfo{.idx = 1, .flags = 0, .name = "test0"},
+                info,
                 "/xyz/openbmc_test/network"sv,
                 config::Parser(),
                 /*emitSignal=*/false,
@@ -54,9 +55,8 @@
 
     void createVlan(uint16_t id)
     {
-        std::string ifname = "test0.";
-        ifname += std::to_string(id);
-        mock_addIF(ifname.c_str(), 1000 + id);
+        system::mock_addIF(system::InterfaceInfo{
+            .idx = id + 10u, .flags = 0, .name = fmt::format("test0.{}", id)});
         interface.createVLAN(id);
     }
 
