Модульный тест Groovy2.0 со Споком: setup () - PullRequest
8 голосов
/ 31 января 2012

Я пишу юнит-тест, используя Spock для 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 (), мойтест не пройден: Градель говорит: FAILED: java.lang.NullPointerException: Невозможно вызвать метод myMethod () для нулевого объекта

Вот как это выглядит с помощью 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()
  }  
}

1 Ответ

23 голосов
/ 01 февраля 2012

В 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

Я не понимаю, почему второй пример с setupSpec() работает и не работает с setup(), потому что в документации сказано иначе:

Примечание. Методы setupSpec () и cleanupSpec () могут не ссылаться Поля экземпляра.

...