diff --git a/test/vtable/vtable.cpp b/test/vtable/vtable.cpp
index 399630c..bab3da4 100644
--- a/test/vtable/vtable.cpp
+++ b/test/vtable/vtable.cpp
@@ -2,29 +2,90 @@
 
 #include <gtest/gtest.h>
 
-static const sdbusplus::vtable::vtable_t example[] = {
-    sdbusplus::vtable::start(),
-    sdbusplus::vtable::method((const char*)1, (const char*)2, (const char*)3,
-                              (sd_bus_message_handler_t)4),
-    sdbusplus::vtable::signal((const char*)5, (const char*)6),
-    sdbusplus::vtable::property((const char*)7, (const char*)8,
-                                (sd_bus_property_get_t)9,
-                                sdbusplus::vtable::property_::const_),
-    sdbusplus::vtable::property((const char*)10, (const char*)11,
-                                (sd_bus_property_get_t)12,
-                                (sd_bus_property_set_t)13),
-    sdbusplus::vtable::property_o((const char*)14, (const char*)15, 16),
-    sdbusplus::vtable::end()};
+extern "C" {
+int test_handler(sd_bus_message* m, void* userdata, sd_bus_error* ret_error);
+int test_get(sd_bus* bus, const char* path, const char* interface,
+             const char* property, sd_bus_message* reply, void* userdata,
+             sd_bus_error* ret_error);
+int test_set(sd_bus* bus, const char* path, const char* interface,
+             const char* property, sd_bus_message* value, void* userdata,
+             sd_bus_error* ret_error);
 
 extern const sd_bus_vtable example2[];
 extern const size_t example2_size;
+}
+
+static const sdbusplus::vtable::vtable_t example[] = {
+    sdbusplus::vtable::start(),
+    sdbusplus::vtable::method("1", "2", "3", &test_handler, 0),
+    sdbusplus::vtable::signal("5", "6"),
+    sdbusplus::vtable::property("7", "8", &test_get,
+                                sdbusplus::vtable::property_::const_),
+    sdbusplus::vtable::property("10", "11", &test_get, &test_set),
+    sdbusplus::vtable::property_o("14", "15", 16),
+    sdbusplus::vtable::end()};
 
 TEST(VtableTest, SameSize)
 {
     ASSERT_EQ(sizeof(example), example2_size);
 }
 
+constexpr bool operator==(const sd_bus_vtable& t1, const sd_bus_vtable& t2)
+{
+    if (t1.type != t2.type || t1.flags != t2.flags)
+    {
+        return false;
+    }
+
+    switch (t1.type)
+    {
+        case _SD_BUS_VTABLE_START:
+            return t1.x.start.element_size == t2.x.start.element_size &&
+                   t1.x.start.features == t2.x.start.features;
+            // FIXME: In systemd 243, there is the new vtable_format_reference
+            // member, but current CI is using libsystemd 242, so we can not
+            // check it yet.
+            // && t1.x.start.vtable_format_reference
+            //      == t2.x.start.vtable_format_reference;
+            break;
+        case _SD_BUS_VTABLE_END:
+        {
+            // The union x shall be all zeros for END
+            constexpr uint8_t allZeors[sizeof(t1.x)] = {0};
+            return memcmp(&t1.x, allZeors, sizeof(t1.x)) == 0 &&
+                   memcmp(&t2.x, allZeors, sizeof(t2.x)) == 0;
+            break;
+        }
+        case _SD_BUS_VTABLE_METHOD:
+            return strcmp(t1.x.method.member, t2.x.method.member) == 0 &&
+                   strcmp(t1.x.method.signature, t2.x.method.signature) == 0 &&
+                   strcmp(t1.x.method.result, t2.x.method.result) == 0 &&
+                   t1.x.method.handler == t2.x.method.handler &&
+                   t1.x.method.offset == t2.x.method.offset &&
+                   strcmp(t1.x.method.names, t2.x.method.names) == 0;
+            break;
+        case _SD_BUS_VTABLE_SIGNAL:
+            return strcmp(t1.x.signal.member, t2.x.signal.member) == 0 &&
+                   strcmp(t1.x.signal.signature, t2.x.signal.signature) == 0 &&
+                   strcmp(t1.x.signal.names, t2.x.signal.names) == 0;
+            break;
+        case _SD_BUS_VTABLE_PROPERTY:
+        case _SD_BUS_VTABLE_WRITABLE_PROPERTY:
+            return strcmp(t1.x.property.member, t2.x.property.member) == 0 &&
+                   strcmp(t1.x.property.signature, t2.x.property.signature) ==
+                       0 &&
+                   t1.x.property.get == t2.x.property.get &&
+                   t1.x.property.set == t2.x.property.set &&
+                   t1.x.property.offset == t2.x.property.offset;
+            break;
+    }
+    return false;
+}
+
 TEST(VtableTest, SameContent)
 {
-    ASSERT_EQ(0, memcmp(example, example2, example2_size));
+    for (size_t i = 0; i < sizeof(example) / sizeof(example[0]); ++i)
+    {
+        EXPECT_EQ(example[i], example2[i]);
+    }
 }
diff --git a/test/vtable/vtable_c.c b/test/vtable/vtable_c.c
index d01506b..105409f 100644
--- a/test/vtable/vtable_c.c
+++ b/test/vtable/vtable_c.c
@@ -1,16 +1,50 @@
 #include <systemd/sd-bus.h>
 
+#define UNUSED(x) (void)(x)
+
+int test_handler(sd_bus_message* m, void* userdata, sd_bus_error* ret_error)
+{
+    UNUSED(m);
+    UNUSED(userdata);
+    UNUSED(ret_error);
+    return 0;
+}
+int test_get(sd_bus* bus, const char* path, const char* interface,
+             const char* property, sd_bus_message* reply, void* userdata,
+             sd_bus_error* ret_error)
+{
+    UNUSED(bus);
+    UNUSED(path);
+    UNUSED(interface);
+    UNUSED(property);
+    UNUSED(reply);
+    UNUSED(userdata);
+    UNUSED(ret_error);
+    return 0;
+}
+int test_set(sd_bus* bus, const char* path, const char* interface,
+             const char* property, sd_bus_message* value, void* userdata,
+             sd_bus_error* ret_error)
+{
+    UNUSED(bus);
+    UNUSED(path);
+    UNUSED(interface);
+    UNUSED(property);
+    UNUSED(value);
+    UNUSED(userdata);
+    UNUSED(ret_error);
+    return 0;
+}
+
+typedef int (*sd_bus_message_handler_t)(sd_bus_message* m, void* userdata,
+                                        sd_bus_error* ret_error);
 const sd_bus_vtable example2[] = {
     SD_BUS_VTABLE_START(0),
-    SD_BUS_METHOD((const char*)1, (const char*)2, (const char*)3,
-                  (sd_bus_message_handler_t)4, 0),
-    SD_BUS_SIGNAL((const char*)5, (const char*)6, 0),
-    SD_BUS_PROPERTY((const char*)7, (const char*)8, (sd_bus_property_get_t)9, 0,
-                    SD_BUS_VTABLE_PROPERTY_CONST),
-    SD_BUS_WRITABLE_PROPERTY((const char*)10, (const char*)11,
-                             (sd_bus_property_get_t)12,
-                             (sd_bus_property_set_t)13, 0, 0),
-    SD_BUS_PROPERTY((const char*)14, (const char*)15, NULL, 16, 0),
+    SD_BUS_METHOD("1", "2", "3", &test_handler, 0),
+    SD_BUS_SIGNAL("5", "6", 0),
+    SD_BUS_PROPERTY("7", "8", &test_get, 0, SD_BUS_VTABLE_PROPERTY_CONST),
+    SD_BUS_WRITABLE_PROPERTY("10", "11", &test_get, &test_set, 0, 0),
+    SD_BUS_PROPERTY("14", "15", NULL, 16, 0),
     SD_BUS_VTABLE_END,
 };
 
