2012-06-07 84 views
4

我使用Groovy,JUnit和EasyMock爲我的Java應用程序編寫單元測試。 在EasyMock中,有幾種重載方法capture(),它們已被棄用,因爲「由於更強的擦除強制執行,不能在Java 7中編譯」。這些方法將參數作爲Capture<T>類型的對象。存在,除其他外,下列方法:Java泛型和Groovy重載

  • static boolean capture(Capture<Boolean> captured)
  • static boolean capture(Capture<Integer> captured)
  • ...
  • static <T> T capture(Capture<T> captured)

任何更多的在Java中,但如果這是不允許你調用該直接從Java中調用正確的方法。例如。當您執行此代碼時

Capture<MyClass> myClassCapture = new Capture<MyClass>(); 
mockObject.someMethod(capture(myClassCapture)); 

正確的方法(列表中的最後一個)被調用。另一方面,如果您從Groovy中調用相同的代碼,那麼列表中的第一個方法將被調用,並在測試中出現錯誤。我認爲這與Java和Groovy如何解決方法有關。我的假設是Java在編譯時綁定了方法,而Groovy試圖在運行時查找方法,並採用它可以找到的任何方法(也許是第一個方法)。

任何人都可以解釋到底發生了什麼嗎?這將更好地理解Java和Groovy之間的不同行爲。

我固定它由內而外的Groovy調用委託給一個Java方法,這會爲我做的工作:

public class EasyMockUtils { 

    public static <T> T captureObject(Capture<T> captureForObject) { 
     return EasyMock.capture(captureForObject); 
    } 
} 

有可能是更好的辦法?

+0

Yu're正確的,Groovy試圖挑方法在運行,而且由於擦除,所有這些方法看起來是一樣的,所以我想它只是抓住第一 –

回答

0

嘗試使用Groovy的@CompileStatic 2.0 - 可能會解決您的問題