例如,如果我执行修改String元类的Groovy脚本,则添加方法foo()
GroovyShell shell1 = new GroovyShell();
shell1.evaluate("String.metaClass.foo = {-> delegate.toUpperCase()}");
Run Code Online (Sandbox Code Playgroud)
当我在那之后创建一个新的shell并执行它时,更改仍然存在
GroovyShell shell2 = new GroovyShell();
Object result = shell2.evaluate("'a'.foo()");
Run Code Online (Sandbox Code Playgroud)
有没有办法在执行GroovyShell后撤消所有元类更改?我试过了
shell1.getClassLoader().clearCache();
Run Code Online (Sandbox Code Playgroud)
和
shell1.resetLoadedClasses();
Run Code Online (Sandbox Code Playgroud)
但这没有改变.
我想通过以下方式"破坏"Groovy中的方法:
Integer.metaClass.plus {Integer n -> delegate + n + 1}
assert 2+2 == 5
Run Code Online (Sandbox Code Playgroud)
我得到StackOverflowException(这并不奇怪).
有没有办法在元类'闭包中使用"原始"加法?
使用Grails 2.1.0
似乎从控制器执行此操作:
render(view: "someView", model: [modelEntry: "hello"])
Run Code Online (Sandbox Code Playgroud)
允许我在该控制器的单元测试中执行此操作:
controller.method()
assert model.modelEntry == "hello"
Run Code Online (Sandbox Code Playgroud)
但是,如果我更改控制器来执行此操作:
render(template: "someTemplate", model: [modelEntry: "hello"])
Run Code Online (Sandbox Code Playgroud)
现在测试中的模型实例是一个空数组.我已经做了很多搜索,并且大多数解决方案似乎都是针对Grails 1的,通常涉及modelAndView对象(我的测试中不存在)或renderArgs(同上).
我发现的唯一解决方案是手动覆盖测试中的视图,如下所示:
views['_someTemplate.gsp'] = '${modelEntry}'
Run Code Online (Sandbox Code Playgroud)
然后对字符串进行断言.但我不喜欢这个解决方案,因为它:
当控制器呈现模板时,有没有办法从测试用例更直接地获取模型中的条目?