Java 在模拟对象上调用方法是调用实方法,而不是模拟实现

Java 在模拟对象上调用方法是调用实方法,而不是模拟实现,java,unit-testing,mockito,Java,Unit Testing,Mockito,我的代码如下所示 public process() { extract(); ... } private Obj extract() { Constructor const = new Constructor(); Obj object = const.getOBJMethod("12345","c:/file/a.zip",null); return object; } 我正在使用mockito测试方法过程。 在我的测试课上,我编写了如下代码 Con

我的代码如下所示

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();
    ---
    }
}

这样,仅当basis为def时才调用extract()。我不想将构造函数对象传递给process()方法,那么有什么解决方案吗?

在要测试的类中,您创建了一个新的构造函数对象(通过
constructor const=new 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;
}
私有最终构造函数常量;//如果需要,拆下最终接头
公共(建造师){
assert const!=null:“const!=null”;//如果愿意,可以使用断言
this.const=const;
//其他构造函数代码。。。
}
//你的其他代码在这里。。。
公共进程(字符串基){
如果(“abc”。等于(基数)){
// ---
}
如果(“def.”等于(基本){
提取();
// ---
}
}
私人Obj摘录(){
Obj object=const.getOBJMethod(“12345”,“c:/file/a.zip”,null);
返回对象;
}
然后,您可以在创建测试对象时注入模拟,并调用
process()
。然后将使用模拟实现

顺便说一句

  • 如果您是代码的所有者,可能需要将
    提取
    方法的可见性更改为
    受保护
    ,以便您也可以测试该方法。请参阅
  • 另外,您可能想了解一些关于依赖项注入的一般知识。使用DI进行测试通常要容易得多。您不必使用DI框架,只需在对象创建时通过方法参数或构造函数注入依赖项即可

如果您想让构造函数对象可以通过模拟进行测试,则可以监视它

public class Test{

    @spy
    Constructor const;

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

    private Obj extract() {

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

还有其他方法吗?我不想将构造函数对象传递给process method()。因为此方法是泛型方法,根据其输入有两种行为。只有一种情况需要构造函数对象。@user3540481:根据更新的问题更新答案。下次,请尽可能具体地使用代码示例。更改问题将导致答案过时。