我正在将应用程序从Grails 1.3.7升级到2.2
到目前为止,它一直相对无痛而且直截了当。
直到我们开始运行单元测试。
在1.3.7下,所有测试都通过了。
在2.2下,大约有一半现在失败了。测试没有改变,它们仍然是旧式的mockDomain ......
对我来说最关心的是某些域类中缺少基本的gorm功能。
像.list和.get
这样的东西失败:testList_NoMaxSpecified_10Shown(com.litle.bldvwr.StreamControllerTests) | groovy.lang.MissingMethodException:没有方法签名:> com.litle.bldvwr.Stream.list()适用于参数类型:()值:[] 可能的解决方案:list(),list(),list(),list(java.lang.Object),list(java.util.Map),> list(java.lang.Object)
和
失败:> testAddFailureOutputToHappyPathWithIntegrationFailure(com.litle.bldvwr.LogParserServiceTests) | groovy.lang.MissingMethodException:没有方法签名:> com.litle.bldvwr.Result.get()适用于参数类型:()值:[] 可能的解决方案:get(java.io.Serializable),get(java.lang.Object),> get(java.io.Serializable),getId(),grep(),grep(java.lang.Object)
此类失败的一般模式是:
mockDomain(Phase, [new Phase(id:1, name: 'xxx')])
mockDomain(Result, [new Result(id:1, phase: Phase.get(1), failureOutput:"")])
logParserService.addFailureOutputTo(Result.get(1))
这是最后一次导致无签名错误。
虽然我们打算开始使用新的单元测试功能,但我希望避免重写500多个当前的测试。
思想,想法?
-Clark
答案 0 :(得分:1)
在域对象的测试中使用新的@Mock()
注释将注入所有预期的模拟GORM方法,您甚至只需save()
域对象而不是{{1}中的列表调用。
mockDomain()
http://grails.org/doc/latest/guide/testing.html#unitTestingDomains
你必须将所有测试更新为新的方式,但它的很多比旧的1.3方式更好。
答案 1 :(得分:0)
所以这就是我们找到的。
使用1.3,你可以这样做:
{
mockDomain(Nightly, [new Nightly(id: 7)])
mockDomain(Result, [
new Result(status: Constants.SUCCESS,
type: Constants.INTEGRATION, nightly: Nightly.get(7))
])
service.callSomething(results, Nightly.get(7))
assert result==Nightly.get(7).property
它会工作得很好。你有一个Mock域对象,id为7,get就可以了。
从那时起,一些事情发生了变化,你不能再将id设置为创建的一部分。
您需要做的是:
night = new Nightly( name:'nightly1')
night.id=1
mockDomain(Nightly, [night])
mockDomain(Result, [
new Result(status: Constants.SUCCESS, type: Constants.INTEGRATION, nightly: Nightly.get(1))
])
并且主要是正确设置模拟。
我们接下来遇到的问题是在mockDomain调用之外,Nightly.get()不起作用。
所以现在我们需要在局部变量中保存“模拟”域,以便进行事后比较和检查。
不是一个完全可怕的解决方案,但不像我们希望的那样优雅。