2 yjjhebe yjjhebe 于 2015.06.16 16:08 提问

sprinmvc 怎么进行单元测试?

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

1个回答

a415613911
a415613911   2015.06.16 17: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);
}

}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
SprinMVC 介绍
SprinMVC介绍,叫你怎么使用,比Struts2更有用。个人意见
springmvc使用junit4实现单元测试
如果读者对junit4单元测试框架,不熟悉的话可以先看一下以下博客http://blog.csdn.net/afeilxc/article/details/6218908因为这里是主要分析spring是如何集成junit4进行测试的,我使用的IDEA开发,项目管理使用的是maven,如果不知如何直接生成junit测试类可以查看如下博客:http://blog.csdn.net/czd3355/art
idea + Maven + Spring + myBatis的单元测试
背景利用Idea和Maven搭建了一个SSM的web项目,对子模块进行测试是非常重要的,此时我的工程结构如下: Maven中,src下有main和test两个目录,main是用来存放我们的工程文件,而test是用来存放测试文件的,此时我完成了Spring + myBatis的整合,并且要对SeckillMapper接口文件进行单元测试public interface SeckillMapper
如何在VS中进行单元测试
在实际项目工程中,我们经常需要对所写的代码进行调试,但是随着工程量的加大,涉及人员的增多,普通的调试无法满足实际的应用需求。 这里简述如何进行单元测试:(单元测试入门) 1、首先我们在已经编写好的项目中右击解决方案,新建项目-->测试项目(本机单元测试项目) 2、在新建测试项目上右键,添加引用,点击添加新引用,找到需要测试的工程点击确定 3、在我们新建的测试工程中的cp
如何在eclipse中通过Juit进行单元测试
如何在eclipse中通过Juit进行单元测试 1、什么是Junit Junit即单元测试,是JAVA语言的单元测试框架,是对程序的一个方法所进行的测试 一般都是由程序员自己通过Junit来进行测试,因此单元测试也叫程序员测试; 如果测试人员熟悉程序员的代码逻辑也可以进行接口测试,可用于进行接口测试,即白盒测试。 2、如何使用Junit 要使用Jun
Android Studio中进行单元测试
在Android开发过程中,我们往往忽略了单元测试功能, 主要还能还是大家觉得 真机在手,运行调试特别直观。 不过如果我们能够养成单元测试的习惯,相信能更加提升我们应用开发的速度。 当我们创建一个Android Studio项目时,我们会发现项目结构中,多了一个test目录  src/test/java  这个目录,就是AS为了方便我们进行单元测试,而帮我们创建的目录。当然,我们也可以自己
如何对Andrioid进行单元测试
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.pccw" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion=
Android开发之在Eclipse中单元测试,在Class中进行单元测试与Activity中单元测试
我们在进行项目开发时,为了提高项目开发效率,方便项目测试中的局部代码功能测试会用到单元测试。这样就不用重新运行一遍整个项目。长期以此我们会就节省大量的时间去做其他的事。            首先来介绍一下如何进行单元测试:                  A . 创建一个Android项目,我这里为TestDemo;                  B . 配置AndroidManif
谈谈单元测试之(一):为什么要进行烦人的单元测试?
前言 最近,在网上看到过一个调查,调查的内容是“程序员在项目开发中编写单元测试的情况”。当然,至于调查的结果,我想聪明的你已经可以猜到了。高达 58.3% 的比例,一般情况下不写单元测试,只有偶尔的情况才会写写。16.6% 的程序员从来都不写单元测试。只有很少的一部分程序员才会在自己的代码中进行单元测试,并保证方法测试通过。看到这些,你想到了什么? 现状 虽然
Intellij idea如何做单元测试 JUnit3
1,使用默认参数新建一个maven工程,工程目录如下图所示: 2,在pom.xml中添加依赖: junit junit 3.8.2 2,在 /main/java下新建工程:MimetypeUtils.java,代码如下: public class MimeTy