Grails Spock集成测试中的继承

时间:2014-07-08 21:19:33

标签: grails spock

我的Grails集成测试套件(使用Spock)中有一些非常类似的测试。我想要一个基础测试类,它具有测试的90%的通用逻辑,然后让测试类从它扩展。

我在想:

public abstract BaseSpecification extends IntegrationSpec {
     public baseTest() {
         //
         setUp:
         //
         ...
         when:
         //
         ...
         then:
         ...    

     }
}

然后:

public class SpecificTestSpecification extends BaseSpecification {
     public baseTest() {
         setup:
            // more set up
            super.baseTest(); 
         when:
            // some more specific testing
         then:
            // som more testing
     }
}

但是尝试这个我有两个问题:

  1. 它同时运行BaseClassSpecificationClass
  2. SpecificationClass运行时,它会失败:
  3.   

    groovy.lang.MissingMethodException:没有方法签名:BaseSpecification.baseTest()适用于参数类型:()值:[]   可能的解决方案:any(),old(java.lang.Object),any(groovy.lang.Closure),notify(),wait(),Spy()       在

    我在spock集成测试中如何实现继承的任何想法?

2 个答案:

答案 0 :(得分:1)

我不知道是否可以用Spock完成。当我尝试时,我找不到重用spock语句的方法,而我所做的就是用可以在spock语句中使用的实用程序方法编写BaseSpecification类。

这是一个示例测试。

@TestFor(Address)
class AddressSpec extends BaseSpecification  {
...
    void "Country code should be 3 chars length"(){

        when: 
            domain.countryCode = countryCode

        then:
            validateField('countryCode', isValid, 'minSize.notmet')

        where:
            [countryCode, isValid] << getMinSizeParams(3)
    }

BaseSpecification类

class BaseSpecification extends Specification {

    // Return params that can be asigned in `where` statement
    def getMinSizeParams(Integer size){[
        [RandomStringUtils.randomAlphabetic(size - 1),    false],
        [RandomStringUtils.randomAlphabetic(size),        true]
    ]}

    // Make an assetion, so it can be used inside `then` statement
     protected void validateField(String field, String code, Boolean shouldBeValid){
        domain.validate([field])
        if(shouldBeValid)
            assert domain.errors[field]?.code != code
        else
            assert domain.errors[field]?.code == code
    }
}

它是一个单元测试,但我认为它也适用于集成测试。

答案 1 :(得分:0)

好的,现在我明白了。

你几乎可以这样使用:

class BaseSpecification extends IntegrationSpec {

    //User userInstance

    def setup() {
        // do your common stuff here like initialize a common user which is used everywhere
    }

    def cleanup() {
    }
}

class SpecificTestSpecification extends BaseSpecification {

    def setup() {
        // specific setup here. Will call the super setup automatically
    }

    def cleanup() {
    }

    void "test something now"() {
        // You can use that userInstance from super class here if defined.
    }
}