2011-12-23 116 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