在Spock测试中应用参数约束

我已经为Spock测试编写了一些Java类。当我尝试验证参数中使用的确切对象时,测试失败。

    def "all events are published to subscribers"() {
        given:
        EventSubscriber subscriber = Mock()
        when:
        subscriber.shouldRegister() >> true
        subscriber.interests() >> new HashSet<Intent>(Arrays.asList(COUNTER,GAUGE))
        publisher.subscribe(subscriber)
        def event = publisher.newEvent("test",COUNTER)
        event.start()
        def child = event.newChild("child",GAUGE)
        event.finish()
        then:
//        2 * subscriber.onCreate(event)
//        1 * subscriber.onStart(event,event.start)
//        1 * subscriber.onEnd(event,event.end)
//        1 * subscriber.onChild(event,child)
        2 * subscriber.onCreate(_)
        1 * subscriber.onStart(_,_)
        1 * subscriber.onEnd(_,_)
        1 * subscriber.onChild(_,_)
    }

注释掉的行失败

  

groovy.lang.MissingPropertyException:没有此类属性:事件   类别:io.hypi.faf.api.EventPublisherTest

     io.hypi.faf.api.EventPublisherTest中的

所有事件都发布到   订阅者(EventPublisherTest.groovy:28)

http://spockframework.org/spock/docs/1.3/all_in_one.html#_argument_constraints似乎建议我可以传入一个值。第一个示例是字符串,但我认为类型无关紧要。

我做错了什么?

Spock:1.3 Groovy:2.5 groovy-test-junit5-2.5.7 JDK:11

zwx917 回答:在Spock测试中应用参数约束

在交互测试中使用的对象实例应在given部分中定义。

这可以工作:

def 'all events are published to subscribers'() {
    given:
    EventSubscriber subscriber = Mock()
    subscriber.shouldRegister() >> true
    subscriber.interests() >> new HashSet<Intent>(Arrays.asList(COUNTER,GAUGE))
    publisher.subscribe(subscriber)
    def event = publisher.newEvent('test',COUNTER)
    def child = event.newChild('child',GAUGE)

    when:
    event.start()
    event.finish()

    then:
    2 * subscriber.onCreate(event)
    1 * subscriber.onStart(event,event.start)
    1 * subscriber.onEnd(event,event.end)
    1 * subscriber.onChild(event,child)
}

但是然后测试onCreate()onChild()的调用会出现问题,因为这些调用不在when部分中,只有onStart()和{{ 1}}可以匹配。

我没有您的类定义来查看详细信息,但我想onEnd()event.start字段是在event.endstart()方法中初始化,然后在{{1 }}和finish()测试不匹配,因为调用测试将在1 * onStart(event,event.start)具有不同的1 * onEnd(event,event.end)event值的阶段进行。因此,只有startend测试会匹配。


看一下这个简单的示例,该示例的工作原理与您的情况类似,但不同之处在于1 * onStart(event,_)实例是在1 * onEnd(event,_)部分中准备的,而没有在event中进行修改,因此将通过测试:

given

更新:但是有一种解决方法。并不是很好,但是它可以正常工作并测试将正确的事件传递到订阅者方法中(我想when具有类似class InvocationWithArgumentsSpec extends Specification { void 'Invocation test works with arguments other then String'() { given: def subscriber = Mock(Subscriber) def simplePublisher = new Publisher() simplePublisher.subscribe(subscriber) def event = new SimpleEvent(name: 'test') when: simplePublisher.fireEvent(event) then: 1 * subscriber.onEvent(event) } } interface Subscriber { void onEvent(SimpleEvent event) } class Publisher { Subscriber subscriber void subscribe(Subscriber subscriber) { this.subscriber = subscriber } void fireEvent(SimpleEvent event) { subscriber.onEvent(event) } } class SimpleEvent { String name } 的东西):

event
本文链接:https://www.f2er.com/3145867.html

大家都在问