相关疑难解决方法(0)

如何在执行GroovyShell后撤消元类更改?

例如,如果我执行修改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 metaprogramming

10
推荐指数
1
解决办法
2837
查看次数

如何在元类中使用该方法更改groovy中方法的行为

我想通过以下方式"破坏"Groovy中的方法:

Integer.metaClass.plus {Integer n -> delegate + n + 1}
assert 2+2 == 5
Run Code Online (Sandbox Code Playgroud)

我得到StackOverflowException(这并不奇怪).

有没有办法在元类'闭包中使用"原始"加法?

groovy metaprogramming

5
推荐指数
1
解决办法
1355
查看次数

Grails控制器在渲染模板时测试关于模型的断言?

使用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)

然后对字符串进行断言.但我不喜欢这个解决方案,因为它:

  1. 要求测试知道模板的文件名
  2. 难以测试没有良好toString()方法的模型条目
  3. 难以对相关模型条目进行多次断言.

当控制器呈现模板时,有没有办法从测试用例更直接地获取模型中的条目?

grails

5
推荐指数
1
解决办法
1971
查看次数

标签 统计

groovy ×2

metaprogramming ×2

grails ×1