在grails升级2.2后,Spock测试失败 - > 2.3.7

时间:2014-07-03 16:39:09

标签: unit-testing grails spock

我有一个带有几个静态方法的命令对象,可以访问其他域对象。

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 ,它会正确地从mocked方法打印测试文本并返回模拟的值。这适用于2.2但现在失败了。我没有使用grails update命令。我创建了一个新项目并将其复制到其中。我发现了各种提示,包括从构建配置中删除分叉的JVM内容,但似乎没有任何效果。

任何想法?感谢。

1 个答案:

答案 0 :(得分:0)

我终于设法让这个工作了。首先,我必须在@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松懈..无论如何,我的测试现在再次起作用!