8

Spock for groovy-2.0 を使用して単体テストを作成し、gradle を使用して実行しています。テストパスに従って書くと。

import spock.lang.Specification

class MyTest extends Specification {  

  def "test if myMethod returns true"() {       
    expect:
      Result == true;   
    where: 
      Result =  new DSLValidator().myMethod()

  }  
}  

myMethod() は、DSLValidator クラスの単純なメソッドで、単純に true を返します。

しかし、setup() 関数を書き、setup() でオブジェクトを作成すると、テストは失敗します: Gradel は言う: FAILED: java.lang.NullPointerException: Cannot invoke method myMethod() on null object

setup() を使用すると、次のようになります。

import spock.lang.Specification

class MyTest extends Specification {  

  def obj

  def setup(){
   obj =  new DSLValidator()
  }

  def "test if myMethod returns true"() {       
    expect:
      Result == true;   
    where: 
      Result =  obj.myMethod()

  }  
}     

誰か助けてくれませんか?

これが私が問題に到達した解決策です:

import spock.lang.Specification

class DSLValidatorTest extends Specification {

  def validator

  def setup() {
    validator = new DSLValidator()
  }


  def "test if DSL is valid"() { 

      expect:
        true == validator.isValid()
  }  
}
4

1 に答える 1

23

インスタンス フィールドに格納されたSpockオブジェクトは、機能メソッド間で共有されません。代わりに、すべての機能メソッドが独自のオブジェクトを取得します。

機能メソッド間でオブジェクトを共有する必要がある場合は、フィールドを宣言し@Sharedます。

class MyTest extends Specification {
    @Shared obj = new DSLValidator()

    def "test if myMethod returns true"() {       
        expect:
          Result == true  
        where: 
          Result =  obj.myMethod()
    }
}

class MyTest extends Specification {
    @Shared obj

    def setupSpec() {
        obj = new DSLValidator()
    }

    def "test if myMethod returns true"() {       
        expect:
          Result == true  
        where: 
          Result =  obj.myMethod()
    }
}

環境をセットアップするための 2 つのフィクスチャ メソッドがあります。

def setup() {}         // run before every feature method
def setupSpec() {}     // run before the first feature method

ドキュメントで別の言い方をしているため、2番目の例がsetupSpec()機能し、失敗する理由がわかりません。setup()

注: setupSpec() および cleanupSpec() メソッドは、インスタンス フィールドを参照しない場合があります。

于 2012-01-31T20:56:44.267 に答える