【问题标题】:Spock mock returns wrong valueSpock 模拟返回错误的值
【发布时间】:2023-03-26 05:40:01
【问题描述】:

我有一个奇怪的用例,当我没有在“then:”部分检查模拟类的两个调用时,spock 模拟返回了正确的值,但是当我在“然后:”部分。 这是模拟:

mockDao.readCounter(_, _, _, _, _) >> dbValue

这里是失败的“then:”部分:

1 * mockDao.readCounter(_, _, _, _, _)
// updateCounters is called with: sum = dbValue + value
1 * mockDao.updateCounter(namespace, date, key, min, shardID, dbValue + value)

在这种情况下,不返回“dbValue”,而是返回“0”。但是,如果我注释掉这两个检查中的任何一个,它就会通过。因此,以下两种情况通过:

//1 * mockDao.readCounter(_, _, _, _, _)
// updateCounters is called with: sum = dbValue + value
1 * mockDao.updateCounter(namespace, date, key, min, shardID, dbValue + value)

OR

1 * mockDao.readCounter(_, _, _, _, _)
// updateCounters is called with: sum = dbValue + value
//1 * mockDao.updateCounter(namespace, date, key, min, shardID, dbValue + value)

这里是 spock 的 gradle 部分:

// spock
testCompile "org.codehaus.groovy:groovy:2.4.7"
compile group: 'org.spockframework', name: 'spock-core', version: '1.0-groovy-2.4'

// !!! To get none-interface base mocking to work with Spock
compile group: 'cglib', name: 'cglib-nodep', version: '3.2.4'

【问题讨论】:

    标签: unit-testing groovy mocking spock


    【解决方案1】:

    这是预期和记录的行为。如果你想在同一个模拟上模拟和存根,你必须在一行中完成,比如

    1 * mockDao.readCounter(_, _, _, _, _) >> dbValue
    

    这里是relevant section

    结合模拟和存根

    模拟和存根齐头并进:

    1 * subscriber.receive("message1") >> "ok"
    1 * subscriber.receive("message2") >> "fail"
    

    当模拟和存根相同的方法调用时,它们必须发生在相同的交互中。特别是,以下 Mockito 风格的 stubbing 和 mocking 拆分为两个单独的语句将不起作用:

    setup:
    subscriber.receive("message1") >> "ok"
    
    when:
    publisher.send("message1")
    
    then:
    1 * subscriber.receive("message1")
    

    Where to Declare Interactions 中所述,receive 调用将首先与then: 块中的交互进行匹配。由于该交互未指定响应,因此将返回方法返回类型的默认值(在本例中为 null)。 (这只是 Spock 对嘲笑的宽容态度的另一个方面。)。因此,setup: 块中的交互永远不会有机会匹配。

    注意 |同一方法调用的模拟和存根必须在同一交互中发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 2022-01-23
      • 2020-02-20
      • 2017-04-30
      • 2018-10-09
      • 2011-02-20
      • 1970-01-01
      相关资源
      最近更新 更多