如何使用模拟对象测试此类:
class Myclass {
MyStudent mystudent=null; Mymethod mymethod= new Mymethod (); public void show(String data){ mystudent=mymethod.display(data); } }
此处mymethod.display()
方法返回mystudent
答案 0 :(得分:1)
如果我理解你的问题,那么你想要一个关于junit测试的例子,在一个简单的例子中使用模拟。 使用Junit4和mockito你的junit测试看起来像这样:
TestTest.java
import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mockito.Matchers.anyString;
import org.junit.Before;
public class TestTest {
private Test test;
private Totest totest;
@Before
public void setup(){
totest = mock(Totest.class);
test = new Test(totest);
}
@org.junit.Test
public void mytest_should_not_be_null_after_I_called_displayed(){
when(totest.display(anyString())).thenReturn(new Mytest());
test.myMethod("some data");
assertNotNull(test.getMytest());
}
}
setup 方法使用 @Before 注释进行了分配。它在此测试类的任何测试用例运行之前执行。测试用例使用 @Test 进行注释。在调用 display 方法后,它只检查字段 mytest 是否为空。
你需要像这样改进你的Test类:
class Test{
private Mytest mytest=null;
private final Totest totest;
public Test(Totest totest) {
this.totest = totest;
}
public void myMethod(String data){
mytest = totest.display(data);
}
public Mytest getMytest() {
return mytest;
}
}
您应该注意构造函数,它将Totest实例作为参数。这个类的totest字段变成final,因为允许设置它的唯一代码是你的构造函数。这样您就可以在Test类中注入任何Totest实例。这是一种依赖注入(一个如何将依赖注入类中的例子,但是还有其他方法可以做到这一点,你也可以使用一个简单的setter,我只是想把我的依赖声明为final,因为它在我看来更清楚)。 那么为什么我在你的琐碎例子中使用了DI?因为我需要在Test中注入一个Totest实例。我在单元测试中注入的实例只是一个模拟。测试用例的第一行定义了调用显示时模拟实例的行为。
我希望它有所作为。