This is a general question regarding Unit Testing Bolts and Spouts in a Storm Topology written in Java.
What is the recommended practice and guideline for unit-testing (JUnit?) Bolts and Spouts?
For instance, I could write a JUnit test for a Bolt
, but without fully understanding the framework (like the lifecycle of a Bolt
) and the Serialization implications, easily make the mistake of Constructor-based creation of non-serializable member variables. In JUnit, this test would pass, but in a topology, it wouldn't work. I fully imagine there are many test points one needs to consider (such as this example with Serialization & lifecycle).
Therefore, is it recommended that if you use JUnit based unit tests, you run a small mock topology (LocalMode
?) and test the implied contract for the Bolt
(or Spout
) under that Topology? Or, is it OK to use JUnit, but the implication being that we have to simulate the lifecycle of a Bolt (creating it, calling prepare()
, mocking a Config
, etc) carefully? In this case, what are some general test points for the class under test (Bolt/Spout) to consider?
What have other developers done, with respect to creating proper unit tests?
I noticed there is a Topology testing API (See: https://github.com/xumingming/storm-lib/blob/master/src/jvm/storm/TestingApiDemo.java). Is it better to use some of that API, and stand up "Test Topologies" for each individual Bolt
& Spout
(and verifying the implicit contract that the Bolt has to provide for, eg - it's Declared outputs)?
Thanks
Since version 0.8.1 Storm's unit testing facilities have been exposed via Java:
For an example how to use this API have a look here: