2010-07-15 75 views
14

我們正在考慮切換到Spring 3.0,並遇到Spring 3.0,EasyMock和Java泛型的交叉問題。如何EasyMock調用返回通配類型的方法?

在一個地方,我們嘲笑一個Spring 3.0 AbstractBeanFactory,特別是這種方法:

public Class<?> getType(String name) throws NoSuchBeanDefinitionException { ... } 

在早期版本的春天,這將返回一個非通用的,一切都很好。隨着通用的,但是,我們遇到麻煩與此:

expect(mockBeanFactory.getType(CLASS_NAME)).andReturn(SOME_CLASS); 

因爲getType回報Class<?>andReturn需要Class<?>作爲一個參數,它根本無法正常工作。

有沒有已知的解決方法呢?

+0

不會這只是返回一個警告? – 2010-07-15 19:39:19

+0

@matt這是一個編譯器錯誤。 – 2010-07-16 15:40:21

回答

20

我遇到過這樣的問題,與Mockito。我不確定它爲什麼會發生。你可以投的預期(..)參數的非通用類型,鼻翼

expect((Class) mockBeanFactory.getType(CLASS_NAME)).andReturn(SOME_CLASS); 

然後你只需要一個警告,而如果你想你可以壓制。不是非常優雅的解決方案;我打算再花幾分鐘看看它。

+5

這樣做。不幸的是,在處理Java泛型時,我已經開始期待不高雅的解決方案。 – 2010-07-15 19:50:43

+4

+1給你們倆。 @AlanKrueger--我不能+1這足夠。我花了20分鐘*試圖找出如何搜索這個問題*:P – arootbeer 2011-10-27 21:10:26

+0

我爲什麼會發生這種情況的猜測是Java無法確定從EasyMock的'expect()'返回的通配符類型將會與從'andReturns()'返回的通配符類型相同。在實現中,編譯器只處理一個通配符:方法的返回類型。 EasyMock設置的方式需要有兩個通配符:預期返回類型和實際返回類型。當每種類型都有通配符時, – Trent 2012-07-20 16:24:23

1

避免任何鑄造和警告最簡單的方法是使用expectLastCall()而不是expect(..)(詳情請參閱my answer to a similar question)。

因此,在這種情況下:

mockBeanFactory.getType(CLASS_NAME); 
expectLastCall().andReturn(SOME_CLASS); 
相關問題