我的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
}
}
但是尝试这个我有两个问题:
BaseClass
和SpecificationClass
SpecificationClass
运行时,它会失败:groovy.lang.MissingMethodException:没有方法签名:BaseSpecification.baseTest()适用于参数类型:()值:[] 可能的解决方案:any(),old(java.lang.Object),any(groovy.lang.Closure),notify(),wait(),Spy() 在
我在spock集成测试中如何实现继承的任何想法?
答案 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.
}
}