2014-07-08 109 views
2

我有一些測試在我的Grails集成測試套件(它使用Spock)中非常相似。我想有一個基本的測試類,其中有90%的測試通用邏輯,然後讓測試類從中延伸出來。Grails Spock集成測試中的繼承

我在想:

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點運行時,它失敗上:

groovy.lang.MissingMethodException:方法的無簽名:BaseSpecification.baseTest()是適用於參數類型:()值:()的任何:[] 可能的解決方案老(java.lang.Object中),任(groovy.lang.Closure),通知(),等待(),間諜() 在

任何想法如何,我可以在我的斯波克集成測試實現繼承?

+0

您需要在** SpecificClass **類聲明中擴展** BaseClass **而不是** IntegrationSpec **。 –

+0

@ShashankAgrawal對不起,我正在那樣做。在我的部分錯別字。 –

+0

好的,所以在代碼本身的問題描述中存在錯字? (有例外嗎?) –

回答

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. 
    } 
} 
1

我不知道它是否能與斯波克完成。當我嘗試時,我沒有找到重用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 
    } 
} 

這是一個單元測試,但我認爲它應該具有的整合工作也進行測試。

+0

我認爲這是最接近你可以得到的。如果有人能提供更好的答案,請留下問題。問題在於繼承實際的測試。但是當你想起你時,不管怎樣都不應該這樣做。 –