2013-02-05 51 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的方式。