混蛋收容所已被注册 2015-06-16 08:08 采纳率: 0%
浏览 2213

sprinmvc 怎么进行单元测试?

项目springmvc + mybatis,用maven搭的框架,现在要对controller层进行单元测试,
请问怎么测,给下思路?其他方法都是用junit来测,现在controller是不是要模拟HTTP请求。
研究了下mokito等测试框架,弄不出来。谢谢!

  • 写回答

1条回答

  • a415613911 2015-06-16 09:30
    关注

    mock主要是帮助你模拟一些不容易被构建的函数、类或者接口。我这有个简单的小例子,你可以参考。我用easymock测试 ,官网:http://www.easymock.org/
    被测试类:
    package controller;

    import java.io.IOException;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.apache.commons.lang.StringUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;

    import po.User;
    import service.UserService;

    @Controller
    public class UserController{

    @Autowired
    private UserService userService;
    
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    
    @RequestMapping(value="getUser")
    public void handleRequest(HttpServletRequest request,HttpServletResponse response) throws IOException{
        String id = request.getParameter("id");
        if(StringUtils.isBlank(id)){
            response.getWriter().write("1");
            return;
        }
    
        User user = null;
        try{
            user = userService.getUserById(Long.valueOf(id));
        }catch(RuntimeException e){
    
        }
    
        if(user == null){
            response.getWriter().write("2");
            return;
        }
    
        response.getWriter().write(user.getName());
    }
    

    }

    测试代码:
    package controller;

    import static org.junit.Assert.*;

    import java.io.IOException;
    import java.io.PrintWriter;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import static org.easymock.EasyMock.*;

    import org.easymock.IMocksControl;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;

    import po.User;
    import service.UserService;

    public class UserControllerTest {
    private HttpServletRequest request;
    private HttpServletResponse response;
    private PrintWriter pw;
    private UserController uc;
    private IMocksControl ic;
    private UserService userService;

    @Before
    public void setUp(){
        uc = new UserController();
        ic = createControl(); 
        request = ic.createMock(HttpServletRequest.class);
        response = ic.createMock(HttpServletResponse.class);
        pw = ic.createMock(PrintWriter.class);
        userService = ic.createMock(UserService.class);
        uc.setUserService(userService);
    }
    
    @After
    public void tearDown(){
        ic.verify();
    }
    
    
    @Test
    public void testIdIsNull() throws IOException {
        expect(request.getParameter("id")).andReturn(null);
        expect(response.getWriter()).andReturn(pw);
        pw.write("1");
        expectLastCall().once();
        ic.replay();;
        uc.handleRequest(request, response);
    }
    
    @Test
    public void testThrowException() throws IOException {
        expect(request.getParameter("id")).andReturn("1");
        expect(userService.getUserById(1)).andThrow(new RuntimeException());
        expect(response.getWriter()).andReturn(pw);
        pw.write("2");
        expectLastCall().once();
        ic.replay();;
        uc.handleRequest(request, response);
    }
    
    @Test
    public void test() throws IOException {
        expect(request.getParameter("id")).andReturn("1");
        User user = new User(1, "fuhaiq");
        expect(userService.getUserById(1)).andReturn(user);
        expect(response.getWriter()).andReturn(pw);
        pw.write(user.getName());
        expectLastCall().once();
        ic.replay();;
        uc.handleRequest(request, response);
    }
    

    }

    评论

报告相同问题?

悬赏问题

  • ¥15 有偿求码,CNN+LSTM实现单通道脑电信号EEG的睡眠分期评估
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路