2015-04-13 2 views
2

Спок тесты впрыскивает нулевой до grailsApplication, как я пытался как для автоматического связывания Grails службы и области объектов (спецификации)grailsApplication автоматического связывания Спока тесты всегда нулевой

код (AttackSpec.groovy)

package core 

import grails.test.mixin.TestFor 
import grails.test.mixin.TestMixin 
import grails.test.mixin.support.GrailsUnitTestMixin 
import spock.lang.Specification 

/** 
* See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions 
*/ 
@TestMixin(GrailsUnitTestMixin) 
@TestFor(Attack) 
class AttackSpec extends Specification { 


    def grailsApplication 


    def setup() { 
     Attack attack = new Attack(); 
     println 'app '+grailsApplication.toString() 
    } 

    def cleanup() { 

    } 

    void "test something"() { 
     setup: 
      println 'app '+grailsApplication.toString() 
    } 
} 

выход

log4j:WARN No appenders could be found for logger (org.codehaus.groovy.grails.commons.DefaultGrailsApplication). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 
appnull 
appnull 
SLF4J: Class path contains multiple SLF4J bindings. 
SLF4J: Found binding in [jar:file:/C:/ops/grails-2.4.4/dist/grails-plugin-log4j-2.4.4.jar!/org/slf4j/impl/StaticLoggerBinder.class] 
SLF4J: Found binding in [jar:file:/C:/ops/grails-2.4.4/lib/org.slf4j/slf4j-simple/jars/slf4j-simple-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class] 
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. 
SLF4J: Actual binding is of type [org.slf4j.impl.GrailsSlf4jLoggerFactory] 

Я попытался с помощью явного @Autowired аннотацию и статической типизации, но это всегда то же самое. мне кажется, что я должен раздувать приложение grails?

+2

Это единичный тест, поэтому вы не можете автоувеличивать. – Ramsharan

+0

Как именно вы проводите этот тест? –

+0

Показать фактическую функцию, которую вы хотите протестировать. – Ramsharan

ответ

1

Какой смысл вводить grailsApplication в единичном тесте ?. Если вы хотите установить конфиг, потому что ваш класс под тест: Attack считывает значение приложения Grails, то вы можете дразнить grailsApplication следующим образом:

def 'test whatever you want to'() { 
    def attack = new Attack() 
    attack.grailsApplication = [config: [my: [setting: "myValue"]]] // if attack uses grailsApplication.config.my.setting internally 

    when: 
    def setting = attack.getMySetting() 

    then: 
    setting == "myValue" 
} 

Или вы могли бы использовать реальный Mock, если вы хотите отслеживать доступ к нему.

Если вы действительно хотите использовать среду grails для тестирования, то доступ к значениям в структуре (по любой причине, которая может быть) выполнена правильно, вы должны использовать тест интеграции. Subclassing IntegrationSpec из Spock будет вводить grailsApplication в ваш тест, поэтому вы можете установить реальную вещь в своем классе Attack.

+0

Мне нужно прочитать атаку из базы данных, я определил компонент который следует сохранить и прочитать для тестов, теперь вы можете объяснить первое предложение? как лучше альтернативы? запись данных в любом месте за пределами AttackSpec может привести к несогласованности данных или нежелательным данным в db или даже сбой моего теста, поскольку он не является самодостаточным тестом, если кто-то испортит переменную или какую-то другую тестовую установку. Таким образом я разрываю и срываю очистка db, в не глобальной настройке env. я попробую ваше решение. – shaydel

+0

первое предложение просто означает, что обычно единичный тест - это что-то, что не зависит от чего-либо, кроме единицы, которую вы хотите протестировать (в оо-языках это буквально означает «класс»). Это из-за изоляции, которую вы хотите достичь в тесте. Из-за этого все зависимости отключены (что я сделал с учетом класса атаки - реализация заглушки для зависимости grailsApplication). Я не уверен, что у меня что-то не так получается, если класс домена использует grailsApplication? Возможно, вам нужно показать еще один код здесь ... –

+0

Эй, Дэвид, это просто еще один способ раздуть \ instanciate и сохранить экземпляр атаки, поэтому вместо использования -> attack = new Attack() ..., я использую предопределенный bean-компонент , grailsApplication не имеет никакого отношения к классу Attack, и он явно не поддерживается там каким-либо образом. – Shay

2

Похоже, вы хотите провести интеграционный тест, а не единичный тест. Переместите свой класс в тестовую папку интеграции, и вам может потребоваться исключить аннотации тестового класса, потому что я думаю, что это только для модульного тестирования.

+0

Это не то, что я хочу сделать, кажется, что ответ использует «static loadExternalBeans = true». но все же я не могу заставить его работать, он не вводит bean-компоненты, определенные в resource.groovy – Shay