当前位置: 首页 > 知识库问答 >
问题:

Groovy每个实例元类方法重写在Spock测试中不像预期的那样工作

袁泓
2023-03-14

我有一个方法名为execute()的类。在一些Spock单元测试中,我虚化了execute方法,并给出了一个模拟闭包,如下所示:

def setup () {
    rule = new DynamicRule ()
}

def "test default execution " (){
    given : "basic AORule "
    def mockres
    rule.metaClass.execute = {-> mockres = "did nothing"}     //mock the action
    def res = rule.execute()


    expect : "execute should do nothing "
    mockres == "did nothing"

}

如果我为此更改此测试:

    rule.metaClass.execute2 = {-> mockres = "did nothing"}     //mock the action
    def res = rule.execute2()

那么测试就通过了。

在Spock外部,我只运行了一个简单的Groovy脚本,并进行了方法重载,这就像我所期望的那样正常工作,并且该方法被关闭

class A {
    def execute () {
        println "thing"
    }
}

def c = new A()
def res
c.execute()

c.metaClass.execute  = {-> res =2 ; println "modified thing "; }

c.execute ()

println "res = "+  res
def "test default execution " (){
    given : "basic AORule "

    def mockres

    def stub = new StubFor(AORule)
    stub.demand.execute { mockres = "did nothing" }
//        rule.metaClass.execute = {-> mockres = "did nothing"}     //mock the action
//        def res = rule.execute()

    expect : "execute should do nothing "
    stub.use {
        rule.execute()
        mockres == "did nothing"

    }
}

为什么简单的per元类在Spock中不起作用?

共有1个答案

鞠自明
2023-03-14

这是Groovy>=2.4.3上的一个公开问题,这里是:groovy-7368。

用元类重写私有方法时存在一个错误。

 类似资料:
  • 为什么下面的失败? 测试的正确方法是什么?

  • 我想使用查找从一个集合中获取一些数据并将其放入另一个集合中。 在localfield或foreignfield中写什么都不重要,因为它从player_game_stats中获取所有数据并将其插入player集合中的每个文档中。我想检查localfield和foreignField是否相等,但lookup不检查这一点。我对mongodb使用NoSqlBooster

  • 你好,亲爱的StackOverflow社区,我最近遇到了一个问题,我不能把一个已经保存的对象的引用放进去。我不想保存或更新对象,因为这些对象是预先插入到我们的数据库中的。 所以基本上我的情况是这样的:我有一个父,在本例中它是一个摄取,对象有一个IntakeTimes列表,它们被声明为remainingdoses。有道理,嗯。 我的模型看起来如下: 我期待着任何帮助或提示,谢谢社区。

  • 我不明白为什么我的结果不同: 我有表订单和列价格(在mysql中键入double)。 数据库中的价格值为13.5。 查询: 结果是:1.21 查询: 结果是1.22 不舍入:结果为1.215 因此,一轮后的正确结果是1.22。 为什么查询

  • 最后是持久性上下文配置: 我很感谢你的帮助。

  • 我正在创建一个简短的javafx程序,包含一个带有一些文本的标签和一个按钮,该按钮应该将标签的字体改为斜体。由于我使用的字体是自定义字体,所以我不能直接调用,因为javafx不能将自定义字体转换为斜体或粗体。 因此,我决定有两个不同的字体文件与相同的字体家族,其中一个有常规风格,另一个有斜体风格。因此,当单击斜体按钮时,程序将加载斜体字体文件,并将标签的字体设置为斜体字体。 但是当我尝试这个程序时