我是mockito的新手。假设我有一个这样的课程
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测试,我正在使用构造函数创建类的对象。我在设置类时是否可以模拟draw()方法?
答案 0 :(得分:2)
不清楚为什么你需要Mockito
。这是一个没有Mockito
的解决方案。
在您的测试中,使用重写的MyClass
方法创建draw()
的实例:
final MyClass myClass = new MyClass() {
@Override
public String draw() {
return "mock data";
}
}
// Now test your class as you want
答案 1 :(得分:1)
你可以使用间谍来做部分模拟(参见here了解如何做到这一点)。
但是像往常一样:当人们开始考虑使用模拟框架的复杂方法时,真正的答案是:退一步并改进您的生产代码。你的构造函数应该只进行 简单的初始化。
在你的情况下,一种合理的方法是:不要调用内部方法来计算该字段的值 - 但将>>值传递给构造函数(换句话说 - 使用依赖注入)。
你仍然可以做类似的事情:
public MyClass(int a) {
this(a, draw());
}
MyClass(int a, String b) {
this.a = a; ...
现在你的单元测试可以愉快地使用那个带有两个参数的ctor - 你需要模拟完全消失。
答案 2 :(得分:0)
使用 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());
}
}