关于java:防止调用构造函数 – Mockito

Prevent calling constructor - Mockito

假设我有classA和classB:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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)而不是其他方法?


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

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

1
2
3
4
5
6
7
8
9
10
11
12
public class A {
    private B b;

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

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

}

现在嘲笑是直的:

1
2
3
4
5
@Mock B b;

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

另一种方法是使用Function

1
2
3
4
5
6
7
8
9
10
11
12
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
    }

}

模拟变得如此:

1
2
3
4
5
@Mock B b;

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

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

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