我使用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);
}
}
有可能是更好的辦法?
Yu're正確的,Groovy試圖挑方法在運行,而且由於擦除,所有這些方法看起來是一樣的,所以我想它只是抓住第一 –