簡體   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