模拟一个类的构造函数中的方法
问题描述:
我是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()方法?
答
不清楚你为什么需要这里的Mockito
。这是一个没有Mockito
的解决方案。
在您的测试与重写draw()
方法创建的MyClass
一个实例:
final MyClass myClass = new MyClass() {
@Override
public String draw() {
return "mock data";
}
}
// Now test your class as you want
答
一种方式与的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());
}
}
答
你可以转办部分嘲讽使用间谍(见here如何做到这一点)。
但像往常一样:当人们开始考虑使用嘲讽框架的复杂方式时,答案是:退一步并改进您的生产代码。你的构造函数应该只做简单的初始化事情。
在你的情况下,一个合理的方法是:不要调用内部方法来计算该字段的值 - 但通过该值给构造函数(换句话说 - 使用依赖注入)。
而你仍然可以这样做:
public MyClass(int a) {
this(a, draw());
}
MyClass(int a, String b) {
this.a = a; ...
现在你的单元测试可以愉快地使用构造函数是需要参数 - 和您的需要模拟东西完全消失。
你可以分享你的测试代码,或者至少是它的相关部分吗? – Mureinik
你想达到什么目的?被测试的类没有任何对另一个对象的依赖。所以没有什么可以嘲笑的。 –
你并不总是必须使用mockito。为了你的情况,为什么你需要嘲笑任何东西。使用简单的junit测试。 – want2learn