Groovy Spock framework每个';只允许一个异常条件;然后';块

Groovy Spock framework每个';只允许一个异常条件;然后';块,groovy,spock,Groovy,Spock,我正在使用gradle和spock框架来测试我的java代码。但是,我正在测试的函数可以抛出我需要测试的3个不同异常。但是,在我的然后子句中,我列出了3个异常,如果没有抛出其中任何一个,测试将通过。但是,我不断遇到以下编译错误: org.spockframework:spock-core:1.0-groovy-2.4 Gradle 2.4 Groovy 2.3.10 我用于测试的spock函数。正在测试的函数可以抛出这些异常 318: Only one exception condition

我正在使用gradle和spock框架来测试我的java代码。但是,我正在测试的函数可以抛出我需要测试的3个不同异常。但是,在我的
然后
子句中,我列出了3个异常,如果没有抛出其中任何一个,测试将通过。但是,我不断遇到以下编译错误:

org.spockframework:spock-core:1.0-groovy-2.4
Gradle 2.4
Groovy 2.3.10
我用于测试的spock函数。正在测试的函数可以抛出这些异常

318: Only one exception condition is allowed per 'then' block @ line 318, column 9.
           notThrown NoResponseException

319: Only one exception condition is allowed per 'then' block @ line 319, column 9.
           notThrown NotConnectedException
有没有办法在一个
then
子句中测试3个以上的异常

我也试过这样做,但也没有成功,因为我把它分成了3个单独的then子句

   def 'Create instant pubsub node'() {
       setup:
        smackClient.initializeConnection(domain, serviceName, resource, port, timeout, debugMode)
        smackClient.connectAndLogin(username, password)

        when:
        smackClient.getSPubSubInstance(smackClient.getClientConnection()).createInstantnode()

        then:
        notThrown XMPPErrorException
        notThrown NoResponseException
        notThrown NotConnectedException
    }

不幸的是,不可能在一个
然后
块中检查多个
notThrown
语句。正如@BillJames评论的那样,您可以使用
noexceptionshown
或我准备的解决方案(只是好奇-我觉得它既没有用处也不可读):

then:
notThrown XMPPErrorException

then:
notThrown NoResponseException

then:
notThrown NotConnectedException
@Grab('org.spockframework:spock-core:1.0-groovy-2.4')
@抓取('cglib:cglib nodep:3.1')
导入spock.lang*
类测试扩展了规范{
def sc=new SomeClass()
def“规格1”(){
什么时候:
sc.someMethod()
然后:
noException抛出()
}
def“规格2”(){
什么时候:
sc.someMethod()
然后:
(e)
哪里:

我想到的最好的方法是使用
where:
子句

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

import spock.lang.*

class Test extends Specification {
    def sc = new SomeClass()

    def 'spec 1'() {
        when:
        sc.someMethod()

        then:
        noExceptionThrown()
    }

    def 'spec 2'() {
        when:
        sc.someMethod()

        then:
        notThrown(e)

        where:
        e << [E1, E2, E3]
    }
}

class SomeClass {
    def someMethod() {
    }
}

class E1 extends RuntimeException {}
class E2 extends RuntimeException {}
class E3 extends RuntimeException {}
def“创建即时发布子节点”(){
设置:
smackClient.initializeConnection(域、服务名、资源、端口、超时、调试模式)
smackClient.connectAndLogin(用户名、密码)
什么时候:
smackClient.getSPubSubInstance(smackClient.getClientConnection()).createInstantnode()
然后:
不抛出异常
哪里:

异常是否可以接受其他异常类型?如果不能,您可以使用NoExceptionSpoorn()。@BillJames我使用了您的建议与Gereth Davis answer相结合。这与您的具体问题无关,但Gradle 2.4基于Groovy 2.3,这就是为什么您应该使用Spock1.0-Groovy-2.3版谢谢,我使用了您的解决方案与@Bill James相结合。
def 'Create instant pubsub node'() {
   setup:
    smackClient.initializeConnection(domain, serviceName, resource, port, timeout, debugMode)
    smackClient.connectAndLogin(username, password)

    when:
    smackClient.getSPubSubInstance(smackClient.getClientConnection()).createInstantnode()

    then:
    notThrown exception

    where:
    exception << [XMPPErrorException, NoResponseException, NotConnectedException]
}