gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:28:11 25 4
gpt4 key购买 nike

我正在尝试使用 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:

Exception in thread "main" java.lang.ClassCastException: org.mockito.internal.creation.jmock.ClassImposterizer$ClassWithSuperclassToWorkAroundCglibBug$$Enhancer

ByMockitoWithCGLIB$$cb6ca60b cannot be cast to 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类型是最终的并且不能被模拟,这就是为什么你需要返回一个虚拟值。

关于java - 使用 Mockito 返回泛型和基元的模拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25271285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com