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

How do I write a spock test to test the interaction between my class under test and an external utility class?

我有以下groovyclass

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 class。当我逐步完成 spock 单元测试时,似乎 Utils.someFunction() 被调用了,所以我对可能发生的事情感到有点困惑。谁能建议?提前致谢!

您必须实施该方法,因为您是 运行 单元测试,而 grails 应用程序不是 运行。

使用注释 @ConfineMetaClassChanges 清理 class Utils

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

}