One of my previous blog post discussed testing Kafka Streams application.
Here is a related tip that might come in handy!
While testing, you might come across
java.util.NoSuchElementException: Uninitialized topic exception. Most probably, this is due to the fact that you invoked
TestOutputTopic.readValue (e.g. as part of an
assert check). The problem is not the exception itself, but the error message
Uninitialized topic which can be confusing. The exception is likely to pop up if your processing
Topology did not work as expected and there was no record in the topic (
TestOutputTopic) you were trying to read from.
Consider this example:
TestInputTopic<String, String> inputTopic = ...; TestOutputTopic<String, String> outputTopic = ...; inputTopic.pipeInput("foo", "bar"); assertThat(outputTopic.readValue(), equalTo("foobar"));
To avoid confusion, you should confirm whether the output topic is empty - both before and (optionally) after checking for the value, e.g.
assertThat("output topic was empty",outputTopic.isEmpty(), is(false)); inputTopic.pipeInput("foo", "bar"); assertThat(outputTopic.readValue(), equalTo("BAR")); assertThat("output topic was not empty",outputTopic.isEmpty(), is(true));
assertThat (with a proper error message) before
outputTopic.readValue() ensures that you get a failure response which you can make sense of. Something that looks like:
testCase1(foo.bar.AppTest) Time elapsed: 0.066 sec <<< FAILURE! java.lang.AssertionError: output topic was empty Expected: is <false> but: was <true> at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20) at org.junit.Assert.assertThat(Assert.java:956) at com.foo.bar.AppTest.testCase1(AppTest.java:58) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
output topic was empty make sense.. at least to me!
If you're interested in Kafka Streams, do check out some of my previous blogs! Happy to get your feedback via Twitter or just drop a comment 🙏🏻
Posted on Mar 18 by: