是否可以动态生成Spock测试方法?

时间:2017-08-21 14:29:47

标签: groovy spock

我有很多重复测试,我想以某种方式抽象它们。辅助方法很有用,但最重要的是。如果我能以某种方式在我的Specification中以编程方式生成测试方法,我将能够删除大量的复制粘贴代码。

具体来说,我正在测试RPC层的方法。如果不以某种方式调用它们,大多数方法必须失败。所以我有Spock测试方法,如:

def observer = Mock(StreamObserver)
def rpc = new UserServiceRpc()

def "draftToOutbox: should fail when called without parent"() {

    def request = draftToOutboxRequest().toBuilder().clearParent().build()

    when:
    rpc.draftToOutbox(request, observer)

    then:
    1 * observer.onError(_)
    1 * observer.onCompleted()
}

def "outboxToDraft: should fail when called without parent"() {

    def request = outboxToDraftRequest().toBuilder().clearParent().build()

    when:
    rpc.outboxToDraft(request, observer)

    then:
    1 * observer.onError(_)
    1 * observer.onCompleted()
}

不幸的是,我不熟悉Groovy的元编程(编译时AST转换)功能,并且不确定如何做到这一点,是否有可能,以及这是否是一个好主意。一方面我有一些复制粘贴,但另一方面我的测试非常易读。不过,我倾向于拥有两全其美:没有复制粘贴的可读性。

1 个答案:

答案 0 :(得分:6)

在这种情况下,您可以使用Data Driven Testing这样的常规内容:

html, body {
  height: 100%;
  width: 100%;
}

html {
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
}

*, *:before, *:after {
  -moz-box-sizing: inherit;
  -webkit-box-sizing: inherit;
  box-sizing: inherit;
}

修改

使用方法指针的示例:

@Unroll
def "#method: should fail when called without parent"() {
    given:
    def request = "$methodToGetRequest"().toBuilder().clearParent().build()
    when:
    rpc."$methodToTest"(request, observer)
    then:
    1 * observer.onError(_)
    1 * observer.onCompleted()

    where:
    methodToTest    | methodToGetRequest
    'draftToOutbox' | 'draftToOutboxRequest'
    'outboxToDraft' | 'outboxToDraftRequest'
}