java - 使用mockito模拟具有通用返回类型的方法

标签 java generics mockito


这是我的问题:

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

有几个类实现容器,我想模拟它们:

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> 类型中的方法 thenReturn(List) 不适用于参数 (List)”。我还尝试传递 List <? extends ModelElement> 类型的本地声明变量然后返回,但这也没有帮助。
非常感谢并欢迎任何帮助:)

最佳答案

您的问题是,无法保证 getChildren() 返回的类型与您的 BornContainer 方法的 varargs 参数的类型匹配。所以编译器对此的提示是正确的。使用中间局部变量实际上会将编译器错误转变为潜在的运行时问题。

在我看来,您的“容器”确实应该是一个泛型类,因为它的行为取决于 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;    
    } 
}

希望这有帮助。

关于java - 使用mockito模拟具有通用返回类型的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8615987/

相关文章:

java - 使用 requests Restful 客户端时出现阿拉伯编码错误

java - 使用 Java Rally Rest API 提取 Rally 缺陷讨论

c# - 返回通用列表

mockito - 在 spy 对象上回答后如何在 Mockito 中执行原始方法

java - 方法返回字符串的 Mockito 测试

java - 如何模拟接口(interface)?

java - 如何在java程序中从不可运行的JAR调用类?

java - 使用 ListIterator 打印数组列表

java - 从通用对象访问字段变量

c# - 当前类的类型可以作为泛型类型参数的值吗?