2012-01-31 15 views
8

Sto scrivendo unit test utilizzando Spock per groovy-2.0 e utilizzando gradle per l'esecuzione. Se scrivo seguendo il test pass.Test unità Groovy2.0 con Spock: setup()

import spock.lang.Specification 

class MyTest extends Specification { 

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

    } 
} 

myMethod() è un metodo semplice nella classe DSLValidator, che restituisce semplicemente true.

Ma se scrivo una funzione setup() e creare l'oggetto nel setup(), il mio test fallisce: Gradel dice: FALLITA: java.lang.NullPointerException: Non è possibile richiamare il metodo myMethod() su un oggetto nullo

di seguito è quello che sembra con 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() 

    } 
}  

qualcuno può aiutarmi?

ecco la soluzione sono arrivato al problema:

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() 
    } 
} 

risposta

20

In Spock oggetti memorizzati in campi di istanza non sono condivisi tra i metodi caratteristica. Invece, ogni metodo di funzionalità ottiene il proprio oggetto.

Se è necessario condividere un oggetto tra i metodi di funzionalità, dichiarare un campo @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() 
    } 
} 

Ci sono 2 metodi di fissaggio per l'impostazione dell'ambiente:

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

non capisco il motivo per cui il secondo esempio con setupSpec() opere e non riesce con setup() perché in documentation afferma diversamente:

Nota: i metodi setupSpec() e cleanupSpec() potrebbero non fare riferimento ai campi di istanza .

+0

Strano ... I documenti di Spock potrebbero davvero fare dei chiarimenti su questo ... Non direi che l'oggetto viene condiviso tra i metodi di feature, ma viene impostato prima che ogni dispositivo venga chiamato ... –

+5

Cos'è che non capisci? Un campo @Shared _è_ condiviso tra i metodi delle caratteristiche e dovrebbe essere impostato con un inizializzatore di campo o con il metodo 'setupSpec'. 'setup' non è una buona scelta qui perché viene chiamato dopo che il blocco' where' è stato valutato. –

+0

Grazie per il chiarimento –