2013-07-02 38 views
1

我試圖用JMock模擬下面的方法,我遇到了一個編譯器錯誤。嘲笑通用參數

類嘲笑:

public interface myClass<T extends SomeClass>{ 
public void myMethod(T parameter); 
public void myOtherMethod(); 
} 

模擬後市展望:

exactly(1).of(myClassMocked).myOtherMethod(); 
exactly(1).of(myClassMocked).myMethod(with(any(SomeClass.class))); 

編譯錯誤:

The method myMethod(capture#6-of ?) in the type myClass is not applicable for the arguments (SomeClass)

我有嘗試將Object.class與其他兼容類切換並與匹配器一起玩。

我無法簡單地更改方法簽名,這太容易了。

它的長短是我想忽略這個特殊的方法調用,但我不能忽略整個MyClass模擬,因爲它是我用於我的測試方法中的其他任務的服務。

編輯: 的解決方法是改變 final myClass<?> myClassMocked= mockery.mock(myClass.class); (由蝕建議通用規格),以 final myClass<SomeClass> myClassMocked= mockery.mock(myClass.class);

回答

0

參數化的界面和T指該類型具有在編譯時被定義。問題在於你獲得myClassMocked的方式,這就是爲什麼期待「任何」通配符?

你應該嘲諷myClass接口與類型參數化的子類,extends SomeClass例如:

public class myClassImpl implements myClass<SomeSubclassOfSomeClass>{ 
    public void myMethod(SomeSubclassOfSomeClass parameter){...} 
    public void myOtherMethod(){...} 
} 
+1

我正要重構我的測試類時,我注意到,當我宣佈我的模擬,我是路過它是一個通配符。我改變了這一切,現在一切正在進行。感謝您指點我正確的方向。 – AnthonyW