2013-02-05 73 views
0

我在升级从Grails的1.3.7应用程序2.2Grails的1.3.7中的Grails 2.2升级,单元测试失败,现在缺少格姆方法

中旬至今,它一直是相对无痛和直线前进。

直到我们开始运行单元测试。

在1.3.7下,所有的测试都通过了。

2.2以下,大约一半现在失败。测试没有改变,他们仍然是老式的mockDomain ...

什么是最让我感兴趣的是,基本的gorm功能在某些域类中缺失。

之类的东西.LIST和不用彷徨

失败:testList_NoMaxSpecified_10Shown(com.litle.bldvwr.StreamControllerTests) | groovy.lang.MissingMethodException:没有方法的签名:> com.litle.bldvwr.Stream.list()适用于参数类型:()values:[] 可能的解决方案:list(),list(),list() ,列表(java.lang.Object中),列表(java.util.Map),>列表(java.lang.Object中)

失败:> testAddFailureOutputToHappyPathWithIntegrationFailure(com.litle。 bldvwr.LogParserServiceTests) | groovy.lang.MissingMethodException:没有方法的签名:> com.litle.bldvwr.Result.get()适用于参数类型:()values:[] 可能的解决方案: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.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()不起作用。

因此,现在我们需要将“嘲讽”域保存在局部变量中,以便进行后期操作比较和检查。

不是一个完全可怕的解决方案,但不如我们所期望的那么优雅。

+0

必须显式分配id是由于某些字段不再可以从构造函数映射默认绑定。 –

1

使用在您的测试域对象的新@Mock()注释将全部注入预期的模拟格姆方法,你甚至可以只save()你的域对象,而不是在mockDomain()通话提供名单。

@Mock([Result, Nightly]) 
class MyTests { 
    void testSomething() { 
    def night = new Nightly(name:'nightly1') 
    night.id=1 
    night.save(validate: false) 

    assert Nightly.get(1).name == 'nightly1' 

    assert Result.count() == 0 

    new Result(status: Constants.SUCCESS, type: Constants.INTEGRATION, 
     nightly: Nightly.get(1)).save(validate: false) 

    assert Result.count() == 1 
    assert Result.findByStatus(Constants.SUCCESS) != null // yay dynamic finders! 

    } 
} 

http://grails.org/doc/latest/guide/testing.html#unitTestingDomains

你必须更新所有测试,以新的方式,但它是更好的,旧的1.3的方式。