防止调用构造函数 - Mockito

时间:2018-01-17 21:19:40

标签: java junit mockito

我们说我有classA和classB:

public class A {
    private B b;

    public A(String id){
        this.b = new B(id);
    }

    public void doSomethingA(String id){
        // do somethingA
    }

}

public class B{
    public B(String id){
        // call anotherThing (id)
   }

    public void doSomethingB(){
        //somethingB
    }
}

现在我想测试classA里面的方法(用它的实例)但是想模拟classB

Mockito允许我模拟classB,但是当我实例化classA时,构造函数调用classB(我想避免)

有没有办法只模拟构造函数(classA或classB)而不是其他方法?

1 个答案:

答案 0 :(得分:3)

你可以嘲笑任何B对象,但你不想这样做 您想要模拟B b类的A字段 哪个不同。
您必须重构您的设计并执行B实例化依赖而不是内部处理。

一种简单的方法是直接传递B变量而不是String作为参数:

public class A {
    private B b;

    public A(B b){
        this.b = b;
    }

    public void doSomethingA(String id){
        // do somethingA
    }

}

现在嘲笑是直的:

@Mock B b;

public void test(){    
  A a = new A(b);
}

另一种方法是使用Function<String, B>

public class A {
    private B b;

    public A(Function<String, B> bFunction, String id){
        this.b = bFunction.apply(id);           
    }

    public void doSomethingA(String id){
        // do somethingA
    }

}

模拟变得如此:

@Mock B b;

public void test(){    
   A a = new A(s-> b, "anyValue");
}

实现代码可以将A实例化为:

A a = new A(B::new, "id");