spring mvc+junit

spring mvc的简单单元测试,说白了就是测试spring mvc的controller.

先参考两篇帖子:

1.http://spring.io/blog/2011/06/21/spring-3-1-m2-testing-with-configuration-classes-and-profiles

2.http://spring.io/blog/2012/11/07/spring-framework-3-2-rc1-new-testing-features


实践:

UserController.java

package com.test.web;
import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.test.domain.User;
import com.test.service.UserService;
@Controller
@RequestMapping("/user")
public class UserController{
	private static final String FILES_DIR="e:/";
	@Resource
	private UserService userService;
	@RequestMapping("/save")
	public String save(User user) {
		userService.save(user);
		return "result";
	}
	@RequestMapping("/getUser")
	public @ResponseBody User getUser(HttpServletRequest request,@RequestBody User user) {
		System.out.println("AAAAAAA::"+user);
		request.setAttribute("data1",user);
		return user;
	}
	@RequestMapping("/getUsers")
	public @ResponseBody List<User> getUsers(HttpServletRequest request,@RequestBody List<User> users) {
		System.out.println(users.getClass().getName());
		for (User user : users) {
			System.out.println("BBBBBBBB::"+user);
		}
		request.setAttribute("data2", users);
		return users;
	}
	@RequestMapping(value = "/upload", method = RequestMethod.POST)
	public String add(HttpServletRequest request,@RequestParam("file") MultipartFile file) {
		//System.out.println("real path::"+request.getServletContext().getRealPath("/"));
		String filename=file.getOriginalFilename();
		File tmpFile=new File(FILES_DIR+filename);
		if(filename!=null&&!file.isEmpty()){
			try {
				FileCopyUtils.copy(file.getBytes(), tmpFile);
				System.out.println("上传成功");
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return "result";
	}
	
}

2.UserControllerTest.java

package com.test.web;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.fileUpload;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import com.test.config.AppConfig;
import com.test.domain.User;
import com.test.util.JsonUtil;
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes={ AppConfig.class})
public class UserControllerTest {
	@Autowired
	private WebApplicationContext webApplicationContext;
	private MockMvc mockMvc;
	@Before
	public void init(){
		mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
	}
	@Test
	public void printBeans(){
		String[] beans=webApplicationContext.getBeanDefinitionNames();
		for (String bean : beans) {
			System.out.println(bean);
		}
	}
	/*测试以普通请求参数发送的请求*/
	@Test
	public void testSave() throws Exception {
		mockMvc.perform(post("/user/save").param("id", "123").param("username", "you")).andExpect(status().isOk()).andExpect(view().name("result"));
	}
	/*测试将数据以JSON格式写入请求体发送的请求*/
	@Test
	public void testGet() throws Exception {
		mockMvc.perform(post("/user/getUser").contentType(JsonUtil.APPLICATION_JSON_UTF8).content(JsonUtil.convertObjectToJsonBytes(new User(22,"werwr")))).andExpect(status().isOk());
	}
	/*测试将数据以JSON格式写入请求体发送的请求*/
	@Test
	public void testGetAll() throws IOException, Exception {
		List<User> list=new ArrayList<User>();
		list.add(new User(23,"你爱我"));
		list.add(new User(25,"我不爱你"));
		mockMvc.perform(post("/user/getUsers").contentType(JsonUtil.APPLICATION_JSON_UTF8).content(JsonUtil.convertObjectToJsonBytes(list))).andExpect(status().isOk());
	}
	/*测试文件上传发送的请求*/
	@Test
	public void testUpload() throws Exception{
		MockMultipartFile file = new MockMultipartFile("file", "orig.txt", null, "bar".getBytes());
		mockMvc.perform(fileUpload("/user/upload").file(file)).andExpect(status().isOk());
	}
}

以上就贴出了spring mvc的单元测试最核心内容和举例的最核心代码.


完整源代码:http://download.csdn.net/detail/xiejx618/7037623



顺便贴一下spring junit(非controller简单bean)

package com.test.service;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.test.domain.User;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class UserServiceTest {
	@Configuration
	@ComponentScan(basePackages={"com.test.service"})
	static class ContextConfiguration {}
	@Resource
	private UserService userService;
	
	@Test
	public void testSave(){
		userService.save(new User(123,"xxx"));
	}

}

下面是设置事务的一个例子

package org.exam.repository;
import org.exam.config.AppConfig;
import org.exam.domain.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader=AnnotationConfigContextLoader.class,classes={AppConfig.class})
@Transactional
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class UserRepositoryTest{
	@Autowired
	private UserRepository userRepository;
	@Test
	@Rollback(false)
	public void testSave() {
		User user=new User();
		user.setUsername("username");
		user.setPassword("password");
		userRepository.save(user);
	}
	@Test
	public void testFindAll() {
		Iterable<User> users=userRepository.findAll();
		for (User user:users){
			System.out.println(user.getUsername());
		}
	}
	@Test
	public void testFindByUsername() {
		User user=userRepository.findByUsername("admin");
		System.out.println(user);
	}

}

@TransactionConfiguration在spring 4.2已过时,只使用@Transactional就OK,也可以继承AbstractTransactionalJUnit4SpringContextTests


温馨提示:如果使用的IDE是idea的话,对于一个类自动生成相应单元测试类的方法是:右键编辑区-->Go To-->Test.(windows的快捷键快捷键是ctrl+shift+t)


评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值