[英]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.