我们说我有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)而不是其他方法?
答案 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");