问题标签 [expandometaclass]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
88 浏览

grails - 如何更改每个测试类的元类

我正在使用 ExpandoMetaClass 使服务在集成测试中始终返回成功,但我希望有一个实际上失败的测试。

ExpandoMetaClass 的使用示例:

注意:目前该服务没有为控制器定义,但因为它是一个引用名为SomeServicelike的类的 spring beansomeService.accessAnotherSystem()工作得很好,即def someService控制器中没有。

因此我不能controller.someService.metaClass.accessAnotherSystem = { return 'failure'}从集成测试中做。

另请注意:这是一个 webflow 的集成测试。

是否可以为一项测试重置元类,或者以某种方式测试我想要的?

0 投票
1 回答
93 浏览

grails - 如何防止服务的元类被覆盖

我试图在集成测试中模拟对外部服务的调用,该服务用于 grails webflow。该服务不在流或对话范围内,而是通过依赖注入添加,请参见此处

我已经设法找到一种方法来通过使用 ExpandoMetaClass 替换它的元类来覆盖服务。这些更改仅在单独运行测试时起作用,如果在此测试之前运行另一个使用相同服务的测试,则元类更改将消失。

覆盖元类的部分:

相关问题:如何更改每个测试的类的元类

有没有办法保留我对测试的更改,或者有其他方法可以覆盖服务。

0 投票
1 回答
296 浏览

grails - Grails 中的 ExpandoMetaClass 以覆盖 Java 库中的行为?

我将 Grails 与第三方 java 库一起使用,我想覆盖其中一个库中的行为。

我尝试在 Bootstrap.groovy 中执行此操作,如下所示:

我知道 SimpleStringFilter 类中的方法 passFilter 被调用的事实,但是我在上面的代码中设置了一个断点并且它从未被命中。

作为参考,java方法的签名是:

那么,是否可以在全局范围内使用 ExpandoMetaClass 覆盖 Java 库中的行为?有人可以解释以这种方式使用它的行为和细微差别吗?

谢谢!

0 投票
1 回答
452 浏览

groovy - 使用 Groovy 元类实现特殊方法

我正在尝试在 Groovy 中修改 JSONObject 的元类,以使其行为尽可能像常规的 Groovy 映射。当我在元类中实现方法时,其中一些方法很简单,例如下面示例中的 JSONObject.metaClass.size。JSONObject 有一个 length() 方法,我只是将它连接到一个新的 size() 方法,但有些方法有特殊含义。例如,要使下标分配起作用,我必须重写 propertyMissing,而不是 putAt。看起来很多收集操作,如 each、collect、findAll 等都是相似的。

我的第一个问题是在这种情况下我需要覆盖哪些特殊方法才能使 each() 工作?我的第二个问题是我自己如何找出答案?在某处是否有从 MOP 获得特殊待遇的方法的参考?我尝试查看 groovy-core 源代码,但其中有很多内容,我不知道从哪里开始。