grails - 私有(private)方法在 Grails 2.5.1 中没有被 mock

标签 grails groovy spock grails-2.5

我们最近从 Grails 2.4.4 升级到 2.5.1 以及 JDK 8。从那以后,下面的测试用例一直失败。

在我们的服务类中,我们定义了一个私有(private)方法来调用外部服务。

def retrieveResults() {       
    def results = callSoapService('serviceName')  
}

private def callSoapService(def serviceName) {     
    // call the service and format the results  
}

在我的 spock 测试中:
def setup() {
     service.metaClass.callSoapService = { String method -> mockSoapService(method) }
}

def "test service"() { 
    when: 
    def results = service.retrieveResults()

    then: 
    some value == results.size()
}

private mockSoapService(String method) {
    //mock the output
}

基本上在这里,私有(private)方法没有被 mock ,并且正在调用实际的服务,这导致我们的测试用例失败。有人有任何指针来模拟 Grails 2.5.1 中的私有(private)方法吗?

最佳答案

当我使用元类遇到模拟问题时,我会使用它并且通常会解决问题:

private MetaClassRegistryCleaner registryCleaner = MetaClassRegistryCleaner.createAndRegister()

void setup() {
    GroovySystem.metaClassRegistry.addMetaClassRegistryChangeEventListener(registryCleaner)
}

void cleanup() {
    registryCleaner.clean()
    GroovySystem.metaClassRegistry.removeMetaClassRegistryChangeEventListener(registryCleaner)
}

关于grails - 私有(private)方法在 Grails 2.5.1 中没有被 mock ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32783611/

相关文章:

grails - Grails中的条件之间是否包含最终值

grails - Grails 2.3.x是否支持JDK 8

groovy - Spock 的@Narrative 和@Title 注释

grails - 当我单击带有Geb的超链接时,页面转换没有发生

unit-testing - Grails 2.3.9 和 Spock : How do mock the returns of "where" queries?

angularjs - 在Groovy应用程序中接收Json数据

javascript - "Autocomplete is not a function"JavaScript错误

grails - 如何通过遍历数组或映射来保存多行数据?

java - 为什么 Groovy 的 Map 比 Array 的伸缩性更好?

groovy - 沙盒阻止我格式化字符串