假设我有 A 类和 B 类:
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)而不模拟其他方法?
最佳答案
您可以 mock 任何 B
反对,但你不想。
你想 mock 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 是直接的:
@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 变得如此:
@Mock B b;
public void test(){
A a = new A(s-> b, "anyValue");
}
实现代码可以将 A 实例化为:
A a = new A(B::new, "id");
关于java - 防止调用构造函数 - Mockito,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48310157/