![](/img/trans.png)
[英]Using PowerMock to mock a private method called in the constructor of the class under test
[英]Mock a method inside a constructor of a class
我是 mockito 的新手。假设我有一个这样的 class
public class MyClass {
int a;
String b;
public MyClass(int a) {
this.a = a;
this.b = draw();
System.out.println("class is created");
}
public String draw() {
System.out.println("my");
return "b";
}
public void apple() {
System.out.println("apple");
}
}
我正在使用 Mockito 编写 JUnit 测试,我正在使用构造函数创建 class 的 object。 当我安装 class 时是否可以模拟 draw() 方法?
不清楚为什么需要这里的Mockito
。 这是没有Mockito
的解决方案。
在您的测试中,使用重写的draw()
方法创建MyClass
的实例:
final MyClass myClass = new MyClass() {
@Override
public String draw() {
return "mock data";
}
}
// Now test your class as you want
您可以转向使用间谍进行部分模拟 (有关方法,请参见此处 )。
但是像往常一样:当人们开始思考使用模拟框架的复杂方法时, 真正的答案是:退后一步并改进您的生产代码。 您的构造函数应仅执行简单的初始化操作。
在您的情况下,一种合理的方法是:不要调用内部方法来计算该字段的值-而是将该值传递给构造函数(换句话说-使用依赖注入)。
而且您仍然可以执行以下操作:
public MyClass(int a) {
this(a, draw());
}
MyClass(int a, String b) {
this.a = a; ...
现在,您的单元测试可以愉快地使用带有两个参数的ctor-并且完全无需模拟任何东西。
使用Mockito测试课程的一种方法是,
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;
public class TestMyClass {
@Mock
private MyClass clazz;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testDraw() {
when(clazz.draw()).thenReturn("My mock hello");
assertEquals("My mock hello", clazz.draw());
}
}
作为给定解决方案的补充,构造函数还可以接收模拟为 function 的方法。
import java.util.function.Supplier;
public class MyClass {
int a;
String b;
public MyClass(int a, Supplier<String> draw) {
this.a = a;
this.b = draw==null? draw() : draw.get();
System.out.println("class is created");
}
public String draw() {
System.out.println("my");
return "b";
}
public void apple() {
System.out.println("apple");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.