繁体   English   中英

在Mock对象上调用方法是调用实际方法而不是模拟实现

[英]Calling a method on Mock object is calling real method instead of mocked implementation

我的代码如下

public process() {
    extract();
    ...
}

private Obj extract() {
    Constructor const = new Constructor();
    Obj object = const.getOBJMethod("12345","c:/file/a.zip",null);
    return object;
}

我正在使用mockito测试方法过程。 在我的测试类中,我编写了代码

Constructor mocckConst = mock(Constructor.class);
Obj mockObject = mock(Obj.class);
when(mocckConst .getOBJMethod("12345","c:/file/a.zip",null).thenReturn(mockObject);

但是当调用extract方法执行testcase时,它将转向getOBJMethod()的实际实现。

构造函数类有另一个内部类。 这会导致任何问题吗? 任何人都可以告诉我这里出了什么问题和解决方案。

我想即兴创作我的流程方法。

public process(String base) {
    if("abc".equals(base)) {
       ---
    }
    else if("def".equals(base) {
    extract();
    ---
    }
}

这样,只有在def为def时才会调用extract()。 我不想将构造函数对象传递给process()方法然后有任何解决方案吗?

在要测试的类中,创建一个新的Constructor对象(通过Constructor const = new Constructor() ),因此,您始终使用REAL实现。 如果要将模拟对象替换为测试对象,则必须注入Constructor对象。 注入也可以通过构造函数进行测试。

private final Constructor const; // remove final, if required

public <ConstructorOfYourClassHere>(Constructor const) {
    assert const != null : "const != null"; // use assertions, if you like

    this.const = const;

    // other constructor code...
}

// your other code here...

public process(String base) {
    if("abc".equals(base)) {
        // ---
    }
    else if("def".equals(base) {
        extract();
        // ---
    }
}

private Obj extract() {
    Obj object = const.getOBJMethod("12345","c:/file/a.zip",null);
    return object;
}

然后,您可以在创建测试对象时调用模拟并调用process() 然后将使用您的模拟实现。

BTW

  • 如果您是代码的所有者,则可能需要将extract方法的可见性更改为protected以便您也可以测试该方法。 看到这里
  • 此外,您可能希望阅读有关依赖注入的内容。 使用DI进行测试通常要容易得多。 您不必使用DI框架,只需通过方法参数注入依赖项,或者在对象创建时通过构造函数注入依赖项。

如果要使用模拟测试它,可以监视Constructor对象。

public class Test{

    @spy
    Constructor const;

    public process() {
        extract();
        ...
    }

    private Obj extract() {

        Obj object = const.getOBJMethod("12345","c:/file/a.zip",null);
        return object;
    }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM