java - 发出大输出元组时如何使用 Spock 测试 Storm

标签 java groovy apache-storm spock

所以我有以下测试:

def "test execute(inputTuple) method emits an outputTuple containing a member ObjectType    
retrieved using the entity_id in inputTuple"() {
    given:
    Tuple inputTuple = Mock(Tuple);

    List<String> objectTypeIDsEmittedByPreviousBolt = new ArrayList<String>();
    objectTypeIDsEmittedByPreviousBolt.add("member");
    objectTypeIDsEmittedByPreviousBolt.add("1196");

    1 * inputTuple.getValues() >> objectTypeIDsEmittedByPreviousBolt;

    when:
    this.bolt.execute(inputTuple);

    then:
    1 * this.collector.emit(inputTuple, THE_OUTPUT_TUPLE);
    1 * this.collector.ack(inputTuple);
}

我收到以下我不明白的错误。是输入元组不匹配还是输出元组不匹配?:

Too few invocations for:

1 * this.collector.emit( inputTuple, [['response':['status':'OK', ... 'member']]]])   (0 invocations)

Unmatched invocations (ordered by similarity):

1 * <OutputCollector>.emit(Mock for type 'Tuple' named 'inputTuple', [['response':['status':'OK', ...'member']]]])


    at org.spockframework.mock.runtime.InteractionScope.verifyInteractions(InteractionScope.java:78)
    at org.spockframework.mock.runtime.MockController.leaveScope(MockController.java:76)
    at member.bolt.CallConsoleAPIToGetAllObjectTypeInfoBoltTest.test execute(inputTuple) method emits an outputTuple containing a member ObjectType retrieved using the entity_id in inputTuple(CallConsoleAPIToGetAllObjectTypeInfoBoltTest.groovy:63)

最佳答案

这就是这个测试应该如何编写(groovyConsole 工作示例):

@Grab('org.spockframework:spock-core:0.7-groovy-2.0')
@Grab('cglib:cglib-nodep:3.1')

import spock.lang.*

class Test extends Specification {
    def "test execute(inputTuple) method emits an outputTuple containing a member ObjectType retrieved using the entity_id in inputTuple"() {
        given:    
        List<String> objectTypeIDsEmittedByPreviousBolt = new ArrayList<String>();
        objectTypeIDsEmittedByPreviousBolt.add("member");
        objectTypeIDsEmittedByPreviousBolt.add("1196");

        Tuple inputTuple = new Tuple(objectTypeIDsEmittedByPreviousBolt);

        Bolt bolt = new Bolt()
        Collector collector = GroovyMock(Collector)
        bolt.collector = collector

        when:
        bolt.execute(inputTuple);

        then:
        1 * collector.ack(inputTuple);
    }
}

class Bolt {
    Collector collector = new Collector()
    def execute(o) {
        collector.ack(o)
    }
}

class Collector {
    def ack(o) {
        println o
    }
}

关于java - 发出大输出元组时如何使用 Spock 测试 Storm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24559983/

相关文章:

java - 如何禁用/关闭 Storm 的日志记录功能

maven - 将元组发送到ElasticSearch时,为什么 Storm 拓扑没有响应

java - 线程 "main"java.util.NoSuchElementException : No line found 中的异常

Java相当于python数组初始化

groovy - 制作Java库 "Groovy"

date - 使用 Groovy 计算两个日期之间的月差

apache-zookeeper - storm 如何利用 zookeeper 实现弹性?

java - 在 findFirst() 之前使用 sorted() 流式传输不再懒惰

java - 推土机字符串到枚举映射

grails - 为什么在 GSP 中包含 Groovy 代码是个坏主意?