繁体   English   中英

使用Mockito返回泛型和基元的模拟方法

[英]Mocking methods that return generics and primitives with Mockito

我正在尝试使用Mockito 1.9.5来模拟一个类,但是要使其工作起来却遇到了很多麻烦。

public class Property<T> {
    private T value;
    public T get() { return this.value; }
    public void set(T value) { this.value = value; }
}

public class Model {
    private final Property<Integer> count = new Property<Integer>();
    public Property<Integer> count() { return this.count; }
}

public class View {
    public View(Model model) {
        Integer count = model.count().get();
    }
}

我写了我的测试样板:

Model model = mock(Model.class, Mockito.RETURNS_MOCKS);
View view = new View(model);

...并且有一个很长的ClassCastException

线程“主”中的异常java.lang.ClassCastException:org.mockito.internal.creation.jmock.ClassImposterizer $ ClassWithSuperclassToWorkAroundCglibBug $$ Enhancer

ByMockitoWithCGLIB $$ cb6ca60b无法强制转换为java.lang.Integer

我知道Mockito不能模拟final类或基元,但是我不知所措,无法完成这项工作。

Property<Integer>的泛型类型在编译期间被擦除。 Mockito只能选择已擦除方法的运行时类型。 对于Mockito,您的课程看起来像这样:

public class Property {
  private Object value;
  public Object get() { return this.value; }
  public void set(Object value) { this.value = value; }
}

模拟该类时,对model.count().get()调用将隐式转换为Integer ,由于您的通用信息, javac会在此添加此指令。 但是,Mockito在观察到上述类型之后才返回Object类型的模拟,因此是异常。 代替

mock(Model.class, Mockito.RETURNS_MOCKS);

明确定义返回值

mock(Model.class, Mockito.RETURNS_DEEP_STUBS); // intermediate mocks
when(model.count().get()).thenReturn(0);

Integer类型是最终类型,不能被模拟,这就是为什么您需要返回一个虚拟值的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM