diff --git a/src/test/java/org/opencord/kafka/integrations/BngPppoeKafkaIntegrationTest.java b/src/test/java/org/opencord/kafka/integrations/BngPppoeKafkaIntegrationTest.java
new file mode 100644
index 0000000..d0bf59d
--- /dev/null
+++ b/src/test/java/org/opencord/kafka/integrations/BngPppoeKafkaIntegrationTest.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.opencord.kafka.integrations;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.opencord.bng.PppoeBngControlHandler;
+import org.opencord.bng.PppoeEventListener;
+import org.opencord.kafka.EventBusService;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * set of unit test cases for BngPppoeKafkaIntegration.
+ */
+class BngPppoeKafkaIntegrationTest extends KafkaIntegrationTestBase {
+
+    private BngPppoeKafkaIntegration bngPppoeKafka;
+    private PppoeEventListener pppoeEventListener;
+
+    @BeforeEach
+    void setUp() {
+        bngPppoeKafka = new BngPppoeKafkaIntegration();
+        bngPppoeKafka.eventBusService = new MockEventBusService();
+        bngPppoeKafka.ignore = new MockPppoeBngControlHandler();
+        bngPppoeKafka.bindPppoeBngControl(bngPppoeKafka.ignore);
+        bngPppoeKafka.activate();
+    }
+
+    @AfterEach
+    void tearDown() {
+        bngPppoeKafka.deactivate();
+    }
+
+    /**
+     * testcase to perform PppoeEvent.
+     */
+    @Test
+    void testbngPpoeEvent() {
+        pppoeEventListener.event(getPppoeEvent());
+        assertEquals(MockEventBusService.kafkaEvents, 1);
+        assertEquals(MockEventBusService.otherCounter, 0);
+    }
+
+    private static class MockEventBusService implements EventBusService {
+        static int kafkaEvents;
+        static int otherCounter;
+
+        MockEventBusService() {
+            kafkaEvents = 0;
+            otherCounter = 0;
+        }
+
+        @Override
+        public void send(String topic, JsonNode data) {
+            if (topic.equals(BngPppoeKafkaIntegration.TOPIC_PPPOE)) {
+                kafkaEvents++;
+            } else {
+                otherCounter++;
+            }
+        }
+    }
+
+    private class MockPppoeBngControlHandler implements PppoeBngControlHandler {
+        @Override
+        public void addListener(PppoeEventListener listener) {
+            pppoeEventListener = listener;
+        }
+
+        @Override
+        public void removeListener(PppoeEventListener listener) {
+            pppoeEventListener = null;
+        }
+    }
+}
\ No newline at end of file
