grails - Groovy 1.8.6使用了不正确的元类方法

标签 grails groovy metaprogramming

在使用Grails 2.0.1进行重构时,我偶然发现了这个问题,但是我将这个问题的基础知识引入了一个简单的1.8.6常规测试中,但仍然失败了。我碰到它是因为我的方法以前不接受任何参数,并且将其更改为接受1个参数。当我更改实现生产代码时,我的测试都没有失败。这很奇怪,因为我在测试中设置的metaClassing设置为不接受任何参数,但是当我传入参数时它仍对我的生产代码作出响应。因此,在下面的示例中,我想知道为什么要调用第二个metaClassing而不是第一个。它不接受任何参数,您可以看到我正在传入一个参数。如果您切换metaClassing的顺序,那么它可以正常工作,但是在这种情况下顺序无关紧要,因为方法签名是不同的。对于为什么会发生这种情况的任何见解将不胜感激。

import groovy.util.GroovyTestCase

class FirstTest extends GroovyTestCase {

    void testStuff() {
        def object = new Object()
        object.metaClass.someMethodName = {Object obj ->
            "ONE"
        }
        object.metaClass.someMethodName = {
            "TWO"
        }

        def result = object.someMethodName(new Object())

        assert "ONE" == result //result is equal to "TWO" in this case
    }

}

编辑

看来我的上述代码可能比有用的代码更令人困惑,所以这里是实际的代码。

原始生产代码:
def create() {
    render(view: "create", model: [domains: Domain.myCustomListMethod().sort{it.cn}])
}

原始测试代码:
@Test
void createShouldIncludeAListOfAllDomainsInModel() {
    def directory = GldapoDirectory.newInstance(
            "", [
                    url: "http://url.com",
                    userDn: "someUserName",
                    password: "superSecretPassword"
            ])
    controller.session.userDirectory = directory
    Domain.metaClass.'static'.myCustomListMethod = {
        [[cn:"1"], [cn:"2"]]
    }

    controller.create()

    assert [[cn:"1"], [cn:"2"]] == controller.modelAndView.model.domains
}

然后,我更新了生产代码以将其传递给session.userDirectory,即使未将其设置为接收任何参数,我的测试仍未修改地通过了:
def create() {
    render(view: "create", model: [domains: Domain.list(session.userDirectory).sort{it.cn}])
}

最佳答案

默认情况下,闭包采用一个(对象类的)参数,即使未声明任何参数(可通过默认变量it访问)

因此,您的第二次关闭将覆盖第一个

关于grails - Groovy 1.8.6使用了不正确的元类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10760300/

相关文章:

linux - Grails 路径不保存

groovy - 将方法添加到闭包

元类中的 Ruby 类变量

ruby - 在模块中扩展类方法

grails - 我在grails-app conf文件夹中找不到数据源文件夹

grails - Grails-从自定义验证程序闭包中调用内置约束

xml - 如何从来自Rest调用的xml响应中获取属性

grails - 为什么域类在同一个GroovyTestCase的两种不同方法中表现不同?

java - 如何将任务添加到 gradle 中的主要 'build' 任务

c# - 如何使用 "delegated"访问器创建属性?