Grails 1.3.7到Grails 2.2升级,单元测试现在失败,缺少GORM方法

时间:2013-02-05 16:03:48

标签: unit-testing grails-2.0

我正在将应用程序从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

2 个答案:

答案 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()不起作用。

所以现在我们需要在局部变量中保存“模拟”域,以便进行事后比较和检查。

不是一个完全可怕的解决方案,但不像我们希望的那样优雅。