2017-03-02 38 views
7

我正在使用Java 1.7進行單元測試的項目中使用Mocikto框架(版本1.9.5)現在我正在將項目遷移到構建和的Java 1.8運行。Type中的方法不適用於可變參數方法升級到Java 1.8的參數

在我的單元測試的一個我試圖嘲弄以下方法

public <T> List<T> myMethod(final String sql, final MyMapper<T> MyMapper, final Argument... args) 

與此代碼

String learningId = "testLeaId"; 
String catalogId = "testCatId"; 
List<String> returnList = new ArrayList<String>(); 
returnList.add(catalogId); 
when(myService.myMethod(Mockito.anyString(), Mockito.any(MyMapper.class), (Argument[]) Mockito.anyVararg())).thenReturn(returnList); 

此代碼的Java 1.7工作正常,現在當我升級我的Java版本到1.8在我的pom.xml我得到以下錯誤...

[ERROR] The method myMethod(String, MyMapper<T>, Argument...) in the type MyService is not applicable for the arguments (String, MyMapper, Argument) 
     C:\somepath\MyDaoTest.java:59 

任何人都可以幫我解決這個錯誤嗎?謝謝

+0

這是一個編譯錯誤,有可能是在此爲myService一些模糊的方法聲明造成這種情況下,雖然你的方法簽名和它的模仿一下好嗎,你能發佈這個'MyService'類的更多細節?你沒有在你的IDE上得到任何錯誤/警告? –

+1

我有錯誤既不的Java 1.7,也不是1.8與完全相同的代碼是你的,也許你測試你使用maven指過時的方法,類等等?試着做了'MVN清潔install',這可能是罪魁禍首,比其他任何想到:/ –

+0

提示:還在等待** **任何種類的反饋的答案。我認爲這僅僅是我們的新手,在這裏搭起的問題和從來就不願回頭;-( –

回答

-1

我認爲Java 8是一種更省型,因爲你想有一個MyMapper<T>,但你只有MyMapper訪問它。

解決方案是使用 Mockito.<MyMapper<ConcreteType>>any()

+0

見我的回答:我認爲,即使是那些類型提示的arent需要更多的 –

+0

我還沒有downvoted;)..此刻都!版本將工作。但是,我會更具體,因爲它要求具體類型的通用什麼可以幫助,如果你想測試這個。 – KLHauser

0

隨着Java8,類型推斷得到了改善,因此,你應該能夠改變

Mockito.any(MyMapper.class) 

Mockity.any() 

例如。 (假設你正在使用最近版本的Mockito本身)

然後你可以找到...那anyVarArg()是deprecated,並且也可以使用any()。

+0

類型推理針對參數化類型進行了改進。在這種情況下,'Mockito.any(MyMapper.class)的類型''是MyMapper',不'MyMapper ',所以這是一個原始類型。按設計,類型推斷對原始類型沒有幫助。 –

+0

我不確定我是否可以關注。錯誤消息正是這樣抱怨的:任何(MyMapper.class)結果都是MyMapper.class類型的......但是新的改進了Mockito 2.10+中的any()會返回正確的**期望的**類型「MyMapper 」? ! –

+0

對不起,誤解了你的答案。是的,我同意你的看法。 –