如何编写spock测试来测试我的测试类和外部实用程序类之间的交互?

时间:2016-11-16 02:06:47

标签: unit-testing grails spock

我有以下groovy类

import Utils

class HelpController {

   def search = {
       Utils.someFunction()
   }

}

这是我的spock groovy规范:

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单元测试时,似乎调用了Utils.someFunction(),所以我对可能发生的事情感到有些困惑。任何人都可以建议吗?提前谢谢!

1 个答案:

答案 0 :(得分: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()
    }

}