📖 Scenario: You are working with Kafka Streams to process data in real-time. You want to test your stream processing logic before deploying it to production.
🎯 Goal: Build a simple Kafka Streams topology and write a test to verify its processing logic.
📋 What You'll Learn
Create a Kafka Streams topology that reads from an input topic and writes to an output topic
Add a configuration variable for the application ID
Implement the core processing logic using a simple mapValues transformation
Write a test that verifies the output of the topology given some input data
💡 Why This Matters
🌍 Real World
Kafka Streams is widely used for real-time data processing in industries like finance, retail, and IoT to transform and analyze streaming data.
💼 Career
Understanding how to build and test Kafka Streams topologies is essential for roles in data engineering, backend development, and real-time analytics.
Progress0 / 4 steps
1
Create the Kafka Streams topology
Create a StreamsBuilder instance called builder and define a stream from the input topic input-topic. Then create a KStream called inputStream from builder.stream("input-topic").
Kafka
Hint
Use StreamsBuilder builder = new StreamsBuilder(); and then KStream<String, String> inputStream = builder.stream("input-topic");
2
Add configuration for application ID
Create a Properties object called props and set the property StreamsConfig.APPLICATION_ID_CONFIG to test-app.
Kafka
Hint
Use Properties props = new Properties(); and then props.put(StreamsConfig.APPLICATION_ID_CONFIG, "test-app");
3
Implement the core processing logic
Use mapValues on inputStream to convert all values to uppercase and assign the result to a KStream<String, String> called upperStream. Then send upperStream to the output topic output-topic using to("output-topic").
Kafka
Hint
Use inputStream.mapValues(value -> value.toUpperCase()) and then upperStream.to("output-topic")
4
Print the test output
Print the string "Topology test passed" to confirm the test ran successfully.
Kafka
Hint
Use System.out.println("Topology test passed"); to print the confirmation message.
Practice
(1/5)
1. What is the main purpose of using TopologyTestDriver in Kafka Streams testing?
easy
A. To simulate the stream processing logic without a real Kafka cluster
B. To deploy the Kafka Streams application to production
C. To monitor Kafka cluster health
D. To create new Kafka topics automatically
Solution
Step 1: Understand the role of TopologyTestDriver
It runs the Kafka Streams topology in memory for testing purposes.
Step 2: Compare with other options
Options A, B, and C relate to topic creation, deployment, or monitoring, which are not testing functions.
Final Answer:
To simulate the stream processing logic without a real Kafka cluster -> Option A
Quick Check:
TopologyTestDriver = simulate streams [OK]
Hint: Remember: TopologyTestDriver runs streams in memory for tests [OK]
Common Mistakes:
Confusing testing with deployment
Thinking it manages Kafka topics
Assuming it monitors Kafka cluster health
2. Which of the following is the correct way to create a TopologyTestDriver instance in Java?
easy
A. TopologyTestDriver.create(topology, properties);
B. new TopologyTestDriver(topology, properties);
C. TopologyTestDriver.start(topology, properties);
D. new TopologyTestDriver(properties, topology);
Solution
Step 1: Recall the constructor signature
The constructor takes the topology first, then the properties.
Step 2: Check each option
new TopologyTestDriver(topology, properties); matches the correct constructor call. Options B and C use non-existent static methods. new TopologyTestDriver(properties, topology); reverses the argument order.
Final Answer:
new TopologyTestDriver(topology, properties); -> Option B
Quick Check:
Constructor = topology, properties [OK]
Hint: Constructor order: topology first, then properties [OK]
Common Mistakes:
Using static methods instead of constructor
Swapping argument order
Calling non-existent start or create methods
3. Given the following code snippet using TopologyTestDriver:
var driver = new TopologyTestDriver(topology, props);
var inputTopic = driver.createInputTopic("input", Serdes.String().serializer(), Serdes.String().serializer());
var outputTopic = driver.createOutputTopic("output", Serdes.String().deserializer(), Serdes.String().deserializer());
inputTopic.pipeInput("key1", "value1");
var result = outputTopic.readKeyValue();
System.out.println(result.key + ":" + result.value);
What will be printed if the topology simply forwards input to output unchanged?
medium
A. key1:value1
B. null:null
C. value1:key1
D. Exception thrown
Solution
Step 1: Understand the topology behavior
The topology forwards input key-value pairs unchanged to the output topic.
Step 2: Trace the test driver code
Input "key1" and "value1" is piped in; outputTopic reads the same key-value pair.
Final Answer:
key1:value1 -> Option A
Quick Check:
Forwarded key-value = key1:value1 [OK]
Hint: If topology forwards, output matches input exactly [OK]
Common Mistakes:
Mixing key and value order
Expecting null output without input
Assuming exceptions without errors
4. Identify the error in this test code snippet using TopologyTestDriver:
var driver = new TopologyTestDriver(topology, props);
var inputTopic = driver.createInputTopic("input", Serdes.String().deserializer(), Serdes.String().serializer());
inputTopic.pipeInput("key", "value");
medium
A. pipeInput method is called with wrong argument types
B. TopologyTestDriver constructor arguments are reversed
C. Input topic serializers and deserializers are swapped
D. Missing call to driver.close()
Solution
Step 1: Check serializer/deserializer usage
Input topic requires serializers for key and value, not deserializers.
Step 2: Identify the swapped serializers
Code uses deserializer for key and serializer for value, which is incorrect.
Final Answer:
Input topic serializers and deserializers are swapped -> Option C
Quick Check:
Input topic needs serializers [OK]
Hint: Input topics need serializers, output topics need deserializers [OK]
Common Mistakes:
Using deserializers for input topic
Ignoring proper resource closing
Confusing constructor argument order
5. You want to test a Kafka Streams topology that filters out records with null values before forwarding. Which approach correctly verifies this behavior using TopologyTestDriver?
hard
A. Send records with null values and expect an exception from TopologyTestDriver
B. Send only null values to input topic and expect output topic to have the same null values
C. Send records with null values and check that output topic is empty without reading
D. Send records with null and non-null values to input topic, then assert output topic only has non-null values
Solution
Step 1: Prepare test input with null and non-null values
This tests the filter logic by including both cases.
Step 2: Verify output topic contents
Assert that only records with non-null values appear in the output topic.
Final Answer:
Send records with null and non-null values to input topic, then assert output topic only has non-null values -> Option D
Quick Check:
Filter test = input mixed, output filtered [OK]
Hint: Test filters by sending mixed input, check filtered output [OK]
Common Mistakes:
Expecting null values to appear in output
Not reading output topic to verify results
Assuming exceptions occur on null values
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.