2011-12-23 95 views
0


這裏一般返回類型的方法是我的問題:模擬用的Mockito

public interface Containter extends ModelElement{ 
    List<? extends ModelElement> getChildren(); 
} 

有幾類實現Containter,我想嘲笑他們:

public class MockMama { 
    public static <T extends Containter, Y extends ModelElement> T bornContainer(Class<T> clazz, Y ... children) { 
      T container = mock(clazz); 
      when(container.getChildren()).thenReturn(Arrays.asList(children)); 
      return container; 
    } 
} 

但是這並未沒有工作。 Eclipse說:「然後返回(List)類型的OngoingStubbing>方法不適用於參數(List)」。我也嘗試傳遞類型List <? extends ModelElement>的本地聲明變量然後返回,但這也沒有幫助。
任何幫助,高度讚賞和歡迎:)

+0

好吧,它看起來可以通過引入額外的本地變量來修復,如 List list = Arrays.asList(children); when(container.getChildren())。thenReturn(list); 有沒有辦法做到這一點,而不會導致原始類型警告? – user656449 2011-12-23 12:29:31

回答

2

您的問題是,不能保證getChildren()返回的類型與您的bornContainer方法的varargs參數的類型相匹配。所以編譯器是正確的抱怨這一點。使用中間局部變量確實會將編譯器錯誤轉化爲潛在的運行時問題。

在我看來,你的「Containter」實際上應該是一個泛型類,因爲它的行爲取決於getChildren()返回的列表中的類型。看看我重寫你的例子。這沒有編譯錯誤或警告。

public interface Containter<Z extends ModelElement> extends ModelElement{  
    List<Z> getChildren(); 
} 

public class MockMama {  
    public static <Y extends ModelElement, T extends Containter<Y>> T bornContainer(Class<T> clazz, Y ... children) {    
     T container = mock(clazz);    
     when(container.getChildren()).thenReturn(Arrays.asList(children));    
     return container;  
    } 
} 

希望這會有所幫助。

+0

感謝您的回答。但Container實際上不能通用 - 它應該能夠返回任何類型的ModelElements。另外我很抱歉,在這個問題上有一個錯字 - 應該沒有Z2ModelElements,所有的多面體只是ModelElements。所以這兩個容器的getChildren和方法泛型都是Y extends ModelElement,爲什麼還要有額外的保證? – user656449 2011-12-26 10:37:16

+0

由於'getChildren'返回的'Y'不一定匹配傳入'bornContainer'的'Y';編譯器正試圖保護你免受你自己的傷害。然而,如果這些方法應該能夠處理任何類型的'ModelElement',那麼你可以完全放棄'Y' - 也就是說,'getChildren'的返回類型可以是'List ',第二個參數到'bornContainer'可能只是'ModelElement ...' – 2011-12-26 20:05:21

+0

好的。我想我明白了。謝謝。 – user656449 2011-12-28 10:40:40

0

通常在測試中,你可以忽略未檢查或原始類型的警告。所以使用編譯器指令(如@SupressWarning("unchecked"))來標註測試通常是安全的。

+0

好吧,是的,它可以被壓制,但我不明白爲什麼原始代碼不能編譯。這讓我很緊張:)我覺得這是一種廢話「你可以做x,除非在y的情況下,除非y做z,在這種情況下你可以如果...」Ken Arnold談論http:// weblogs .java.net/blog/arnold/archive/2005/06/generics_consid.html – user656449 2011-12-23 12:55:51