使用junit+mockito进行mock测试实例

刚开始做网站的时候,测试都是这样的(比如测试修改用户信息的表单逻辑):设置断点,启动运行程序,登陆,点击点击点击然后进入到测试的页面,输入测试数据,进入断点…….。一个大的程序启动又慢,还要登陆,还要输入那么多表单信息才进入到测试的那段代码,我的内心几乎是崩溃的。那时就想,要是测试web程序能像测试普通程序那样,直接测试要测试的那段代码该多好。后来发现,mock测试可以做到。

mock测试实例

新建一个maven项目,加入junit和mockito的依赖。

    <dependency>
        <groupId>org.mockitogroupId>
        <artifactId>mockito-allartifactId>
        <version>1.8.4version>
    dependency>

    <dependency>
      <groupId>junitgroupId>
      <artifactId>junitartifactId>
      <version>4.8.2version>
    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的doGetdoPost方法。新建一个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()给它增加需要的模拟行为。

参考


1、Java Mocking入门—使用Mockito
2、源代码下载

你可能感兴趣的:(测试)