【问题标题】:Private methods not getting mocked in Grails 2.5.1私有方法在 Grails 2.5.1 中没有被嘲笑
【发布时间】:2015-09-25 13:43:41
【问题描述】:

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

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

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
}

基本上在这里,私有方法没有被嘲笑,而是调用了实际的服务,这导致我们的测试用例失败。有人有任何指针来模拟 Grails 2.5.1 中的私有方法吗?

【问题讨论】:

  • 您的元方法中有String,但您的服务中有def...service.metaClass.callSoapService = { method -> mockSoapService(method) } 有效吗?
  • 试过了,不行
  • 我想挑战编写这个单元测试背后的原因。即使你实现了你想要的,你也只是测试一个模拟的方法。该测试将始终通过,并且不会为您的项目增加任何价值。 retrieveResults() 方法是否有更多代码未在此处显示?

标签: grails groovy spock grails-2.5


【解决方案1】:

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

private MetaClassRegistryCleaner registryCleaner = MetaClassRegistryCleaner.createAndRegister()

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2018-12-24
    相关资源
    最近更新 更多