本节书摘来华章计算机《Storm实时数据处理》一书中的第1章 ,第1.8节,(澳)Quinton Anderson 著 卢誉声 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.8 对Bolt进行单元测试
对于任何产品交付来说,单元测试都是其重要组成部分,我们也必须对Bolt中实现的逻辑进行单元测试。
1.8.1 准备工作
单元测试中有一种很常用的技术叫做Mock,它允许你动态生成依赖对象的假实例,这样才能保证对一个特定类进行准确的单元测试。本书通过JUnit 4和JMock来演示单元测试。请花些时间阅读JMock使用方法,网址是 http://jmock.org/cookbook.html。
1.8.2 实战
Step01 在src/test/java目录下创建storm.cookbook包,然后创建StormTestCase类。该类是一些初始化代码的抽象类:
Step02 创建TestRepeatVisitBolt类,并继承StormTestCase,然后使用参数化执行器注解来标记它:
Step03 execute方法中涵盖了类的测试用例逻辑:
Step04 接下来,我们还需要定义一些参数:
Step05 在使用Redis进行测试之前,必须初始化一些基本配置的值:
保留测试完成后栈中的数据总是有用的,这样便于复查和调试逻辑。我们只要在下一次测试执行时清理栈中的数据就好了。
1.8.3 解析
首先,单元测试是由一组测试数据驱动的测试。这就是说我们能在测试不同用例的时候免去许多无谓和重复的操作。在测试运行之前会将静态数据写入Redis 数据库中,保证了测试的正确运行。接着测试程序就会一行一行地执行参数化的测试数据,并验证许多不同的用例。
JMock负责Mock收集器及Bolt发送的Tuple。然后通过Mock的对象与对象之间的交互来定义我们预期执行的操作:
我们应该把Expectations对象内的代码当做描述性的语言来理解。比如方法体第一行的意思就是:希望Tuple的getStringByField方法被精确地调用一次(必须只被调用一次),而且必定会返回一个值给被测试的对象。
这种机制能够让我们准确地测试Bolt。
还有很多种不同的单元测试方法,我们通常会利用数据库来实现测试。除非万不得已,还是建议Mock所有类的依赖项,这样才能实现真正意义上的单元测试。对于“地理位置信息Bolt”的resolver抽象结构来说,我们完全可以Mock所有成员。