2014-10-28 109 views
1

我觀察到一個斷言失敗,我試圖在下面進行描述。簡而言之,當我調用重寫的方法時,初始化的類成員虛假地變爲空成員變量爲空,虛假?

abstract class A<T> { 
    T target 

    def something() { 
     assert target != null  // sanity check -- fails when invoked below 
     return this 
    } 
} 

class B extends A<Something> { 
    static B makeB() { 
     def b = new B() 
     b.target = new Something(); 
     assert b.target != null 
     return b 
    } 
} 

// package test 
// Test code 
// 
def b = B.makeB()  // <-- success. 
assert b != null 
assert b.target != null 
b.something()   // <-- fails assertion 
print "Success!" 

我有產生最小的測試用例的麻煩 - 在成功compileonline.com 但與我們在我們的機器代碼(到位東西與龍)運行在上面。

的問題消失,如果我重新實現在子類B.

有沒有人觀察到了類似的效果something方法?我已經非常沮喪了。

+0

「Something」類在哪裏?你能補充嗎? – 2014-10-28 09:32:12

+0

它恰好是一個Grails域對象 - 這是我不瞭解最小失敗測試用例的地方。也許相關:A用Something和SomethingElse擴展(extends Something)。 – 2014-10-28 09:36:21

+0

事實上,我在代碼中用'Long'替換了'Something',並且發生了同樣的故障。還沒有找到一個獨立失敗的測試用例。 – 2014-10-28 09:50:50

回答

0

問題實測值:一個混合使用相同的部件名稱

通過代碼步進和仔細檢查本地棧變量,我們發現,在具有Grails Integration Test Mixin可變target這是在接收到分配消息的實例。假設任何與mixin的實例變量共享一個名字的實例變量都應該遵循上面描述的行爲,但是我們不知道整個條件集合

最合理的解決方案是時間方面的@cfrick)將我們的變量target重命名爲其他內容。

後續問題

  1. 這是預期的行爲?最好的解決方案在一個壞的海洋?
  2. 此行爲是否因新的Groovy編譯器或Grails堆棧而改變?
  3. (仍然相關)什麼是最小測試用例?