当前位置: 首页 > 知识库问答 >
问题:

用Mockito模仿返回泛型和原语的方法

通博实
2023-03-14

我试图用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);

...并得到一个长的< code>ClassCastException:

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

ByMockitoWithCGLIB$$cb6ca60b不能强制转换为java.lang.Integer

我知道Mockito不能模仿< code>final类或原语,但是我不知道我需要做些什么来使它工作。

共有1个答案

鞠自明
2023-03-14

属性的泛型类型

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

当您模拟这个类时,您对< code>model.count()的调用。get()被隐式转换为< code>Integer,其中该指令是由javac根据您的泛型信息添加的。然而,Mockito在观察到上述类型后,仅返回一个< code>Object类型的模拟,因此出现异常。代替

mock(Model.class, Mockito.RETURNS_MOCKS);

显式定义返回值

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

< code>Integer类型是最终类型,不能被模仿,这就是为什么您需要返回一个空值。

 类似资料:
  • 问题内容: 我正在使用Mockito 1.9.5。我有以下代码: 我收到一句编译错误: 但是,当我使用模拟方法时,不会出现错误。谁能告诉我怎么回事?使用该方法时为什么会出现错误?当第三方提供且无法修改时,还有其他方法可以解决此问题吗? 问题答案: 编辑 :从Mockito 1.10.x开始,嵌入在类中的泛型类型现在由Mockito用于深层存根。即。 Mockito尽最大努力获取编译器嵌入的类型信息

  • 我在用Mock编写单元测试时遇到了一个问题。有一个对象,我需要模拟有很多getter,我在代码中调用它们。但是,这些不是我的单元测试的目的。所以,有没有一种方法我可以模拟所有的方法,而不是一个一个地模拟它们。 下面是代码示例: 那么,有没有一种方法可以避免为无用的“field1”到“field20”写所有的“when”

  • 我有一个单例春豆,可以创建原型豆;这些是从字段中检索的: 现在我想为单例创建一个JUnit-Test: 但是可以理解的是,这并没有正确设置单例的< code>Provider。 有什么办法吗?我希望避免创建创建原型实例的Singleton Factory bean。 或者,对单例使用一个< code>@Lookup-factory方法是否很有可能?我还没有研究过这个。

  • 我正试图模拟一个泛型方法,但无论我做什么尝试,都会得到类转换异常。正在测试的类是 而测试类是 其他帮助器类和接口有: 此外,出现此错误的原因可能是:1。您使用final/private/equals()/hashCode()方法中的任一个作为存根。这些方法不能被截取/验证。不支持在非公共父类上声明的模拟方法。2.内部when()不是对mock而是对其他对象调用method。

  • 这是我的实际服务方法。在测试时,它给我的变量为空。用户和响应 我试图写一个测试用例和模拟方法findByEmail()和保存(),但同时嘲笑我没有收到用户对象在返回中提到的thenback()和doback()。 有人能帮忙吗。

  • 问题内容: 背景 我曾经写过这种方法: 应该这样称呼它: 这很好用(尽管我在研究当前容易出错的问题时在这里的答案中已经看到)。 目前的情况 无论如何,现在我正在编写以下代码(在扩展javax.servlet.jsp.tagext.TagSupport的类中): 目的是可以这样称呼: 我的评估方法中的代码显然不起作用。的第二个参数应该是Class对象。这导致我: 我的问题 如何获得通用(返回)类型的