使用mockito模拟具有泛型返回类型的方法

时间:2011-12-23 12:18:07

标签: java generics 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说“类型OngoingStubbing&gt;中的方法thenReturn(List)不适用于参数(List)”。我也尝试将List <? extends ModelElement>类型的本地声明变量传递给thenReturn,但这也无济于事。
任何帮助都受到高度赞赏和欢迎:)

2 个答案:

答案 0 :(得分: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;    
    } 
}

希望这有帮助。

答案 1 :(得分:0)

通常在测试中,您可以忽略未经检查或原始类型的警告。因此,使用@SupressWarning("unchecked")等编译器指令来注释测试通常是安全的。