刚开始做网站的时候,测试都是这样的(比如测试修改用户信息的表单逻辑):设置断点,启动运行程序,登陆,点击点击点击然后进入到测试的页面,输入测试数据,进入断点…….。一个大的程序启动又慢,还要登陆,还要输入那么多表单信息才进入到测试的那段代码,我的内心几乎是崩溃的。那时就想,要是测试web程序能像测试普通程序那样,直接测试要测试的那段代码该多好。后来发现,mock测试可以做到。
mock测试实例
新建一个maven项目,加入junit和mockito的依赖。
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.8.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
</dependency>
新建一个servlet类作为controller:
public class StudentController extends HttpServlet{
@Override
public void doGet(HttpServletRequest request,HttpServletResponse response){
String name = request.getParameter("name");
System.out.println(name);
}
@Override
public void doPost(HttpServletRequest request,HttpServletResponse response){
}
}
接下来我们就要测试这个Servlet的doGet
和doPost
方法。新建一个Junit测试类如下:
//这两个import要自己手写引进来
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.junit.Before;
import org.junit.Test;
public class TestStudentController {
private HttpServletRequest request;
private HttpServletResponse response;
private StudentController studentController;
@Before
public void setUp() throws Exception {
request = mock(HttpServletRequest.class);
response = mock(HttpServletResponse.class);
when(request.getParameter("name")).thenReturn("123");
}
@Test
public void testDoGet() {
studentController = new StudentController();
studentController.doGet(request, response);
}
@Test
public void testDoPost() {
}
}
分析一下上面的代码:
首先,要测试的doGet(request, response)
,我们发现doGet
需要两个参数,而且这两个参数是容器传进来的,自己无法创建,所以就模拟一个出来。如下:
request = mock(HttpServletRequest.class);
response = mock(HttpServletResponse.class);
对象是模拟出来了,但是对象的行为还没模拟出来。我们发现Servlet的doGet
方法用到了request.getParameter("name")
,所以我们就给模拟对象增加这个模拟行为。如下:
when(request.getParameter("name")).thenReturn("123");
每当模拟对象调用getParameter("name")
方法时,就返回一个值123
,就好像真的执行了request.getParameter("name")
一样。
总而言之,mock测试其实就一句话:需要什么不能自己创建的,就mock()出来,然后用when()给它增加需要的模拟行为。