2016-11-16 6 views
0

У меня есть следующий Groovy классаКак написать тест spock для проверки взаимодействия между тестируемым классом и внешним классом?

import Utils 

class HelpController { 

    def search = { 
     Utils.someFunction() 
    } 

} 

Вот мой Спок заводная спецификация:

import Utils 
import grails.test.mixin.* 
import HelpController 

@TestMixin(GrailsUnitTestMixin) 
@TestFor(HelpController) 
class HelpControllerSpec extends Specification { 

    void "should call someFunction method in Utils class"() { 

     when: 
     helpController.search() 

     then: 
     1 * Utils.someFunction() 
    } 

} 

Запуск результатов тестирования ошибки:

too few invocations for Utils.someFunction() (0 invocations) 

Utils является классом Java. Когда я перехожу к тесту с помощью spock unit, кажется, что Utils.someFunction() вызывается так, что я немного смущен относительно того, что может происходить. Может ли кто-нибудь посоветовать? Заранее спасибо!

ответ

1

Вы должны реализовать этот метод, потому что вы используете единичный тест, а приложение grails не работает.

Используйте аннотацию @ConfineMetaClassChanges для очистки метакласса класса Utils

import Utils 
import grails.test.mixin.* 
import HelpController 
import spock.util.mop.ConfineMetaClassChanges 

@TestMixin(GrailsUnitTestMixin) 
@TestFor(HelpController) 
@ConfineMetaClassChanges([Utils]) 
class HelpControllerSpec extends Specification { 

    setup(){ 
     Utils.metaClass.someFunction = { 
      //expected response 
     } 
    } 

    void "should call someFunction method in Utils class"() { 

     when: 
     helpController.search() 

     then: 
     1 * Utils.someFunction() 
    } 

} 
+0

Хороший, но не переделка Utils.metaClass идти внутри рамки, охваченной @ConfineMetaClassChanges? – railsdog

+0

Вы правы! спасибо – quindimildev

+0

Спасибо за предложение! Тем не менее, я вижу ошибку «Нет такого свойства: метакласс для Utils». Я попытался расширить Expando в Utils, но все равно получаю ту же ошибку ... заметьте, что Utils - это POJO –