【问题标题】:Spock tests failing after grails upgrade 2.2 -> 2.3.7grails 升级 2.2 -> 2.3.7 后 Spock 测试失败
【发布时间】:2014-07-03 16:39:09
【问题描述】:

我有一个命令对象,其中包含几个访问其他域对象的静态方法。

static def isAValidSerial(String serialReference) {
   return InventoryMaster.partSerialReferenceList(null, serialReference).size() > 0
}

此方法由命令对象上的验证约束调用。

在单元测试中,我模拟了这种行为。

TransactionDetailCommand.metaClass.static.isAValidSerial = { String a -> println "mocked method called"; true }

在调用某些验证之前:

obj.validate(['serialReference'])

但是,这会引发 2.2.0 中没有的异常。

错误是:

java.lang.IllegalStateException: Method on class [com.myStuff.MyClass] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly.

尽管从验证器调用它时进行了模拟,但它似乎试图调用真实方法而不是模拟。如果我在 obj.validate() 之前放置一个显式 println ,它会正确打印来自模拟方法的测试文本并返回模拟值。这适用于 2.2,但现在失败了。我没有使用 grails update 命令。我创建了一个新项目并将内容复制到其中。我发现了各种技巧,包括从构建配置中删除分叉的 JVM 内容,但似乎没有任何效果。

任何人有什么想法吗?谢谢。

【问题讨论】:

    标签: unit-testing grails spock


    【解决方案1】:

    我终于设法让它工作了。首先,我必须在 @Mock 注释中明确声明协作类(InventoryMaster)——在 2.2.n 上,这不是必需的。此外,当从我的验证器调用模拟静态方法时,我必须明确限定静态调用..所以过去看起来像

    if (!(cmdObj.transactionType.transactionIsAReceipt() || isAValidSerial(serialReference))) {
                    return 'TransactionDetailCommand.serialReference.not.found'
    }
    

    并且必须将 2.2.n 下的工作转换为 ..

    if (!(cmdObj.transactionType.transactionIsAReceipt() || TransactionDetailCommand.isAValidSerial(serialReference))) {
                    return 'TransactionDetailCommand.serialReference.not.found'
                }
    

    这有点道理,因为我之前使用

    模拟了 isAValidSerial
    TransactionDetailCommand.metaClass.static.isAValidSerial = {a -> println "running mock isAValidSerial -> true"; true }
    

    也许那是 2.2.n 松懈.. 无论如何,我的测试现在又可以工作了!

    【讨论】:

      猜你喜欢
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 2013-05-09
      相关资源
      最近更新 更多