【问题标题】:How can I call the actual constructor of a mocked mockito object?如何调用模拟模拟对象的实际构造函数?
【发布时间】:2016-10-31 05:38:47
【问题描述】:

我有类似的代码

class superClass {
    public String transform(String str) {
        //lots of logic including ajax calls
        return("Modified"+str);
    }
}

class baseClass extends superClass {
    private FetchData fetchData;
    baseClass(FetchData fetchData) {   
        this.fetchData = fetchData;
    }

    public String parse() {
        String str = fetchData.get();
        //some more logic to modify str
        return transform(str);
    }
}

我正在使用 mockito 和 junit 来测试它。我在嘲笑baseClass 并做这样的事情

baseClass baseMock = Mockito.mock(baseClass.class);
Mockito.when(baseMock.parse()).thenCallRealMethod();
Mockito.when(baseMock.transform()).thenReturn("Something");

我如何注入模拟 fetchData,因为它是通过构造函数注入的?

【问题讨论】:

  • 你不能。您应该在基类中使用反射或公开 setter。
  • 你在测试什么,baseClass?如果是这样,我想你可能误解了如何测试。如果你想测试baseClass,你不会嘲笑它。你会嘲笑它需要的任何没有被测试的东西。如果您想模拟FetchData,您可以通过传递baseClass 一个不同的FetchData 实现(模拟)轻松地做到这一点。另外,你的命名有点混乱。超类是基类。你的baseClass 应该是DerivedClass,你的类名应该总是以大写字母开头。并且请正确格式化您的代码,它目前也无法编译。
  • 提示:java 类名使用大写。总是。

标签: java unit-testing junit mockito powermock


【解决方案1】:

您可以使用Mockito.spy (http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#spy):

baseClass object = new baseClass(new FetchData());
baseClass spy = Mockito.spy(object);

Mockito.when(spy.parse()).thenCallRealMethod();
Mockito.when(spy.transform()).thenReturn("Something");

【讨论】:

  • 太棒了,谢谢 :) 一个问题,我如何使用 do 语法调用实际方法,因为 Mockito.when(spy.parse()).thenCallRealMethod(); 调用实际方法,当该模拟行执行时,我希望该方法仅当我调用 spy.parse() 时才调用
  • Mockito.doCallRealMethod().when(<objectInstance>).<method>(); 但是,请看下面@GhostCat 的帖子。你似乎试图测试的东西没有意义。或者,如果您只是想测试一个抽象基类,也许不要使用 mockito。在您的测试类中创建它的子类并使用它。
【解决方案2】:

您的问题具有不同的性质:您创建了难以测试的代码。这就是构造函数的问题:人们必须非常小心他们在做什么。

另一件事是您直接“遇到”“更喜欢组合而不是继承”。简单地扩展一些其他类来继承一些有用的行为可能很诱人 - 但是当你这样做时,你就会遇到这类问题!

我有点不回答:退后一步,仔细看看你的设计,如果这真的是最好的解决方案。可能您首先观看那些videos 以了解我在说什么。如果您身边有经验丰富的人,请与他们交谈;并让他们审核您的设计。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多