持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情
本文系作者 不太自律的程序猿原创,转载请私信并在文章开头附带作者和原文地址链接。
测试类基类
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.WebApplicationContext;
//这个必须使用junit4.9以上才有
@RunWith(SpringJUnit4ClassRunner.class)
//单元测试的时候真实的开启一个web服务
@WebAppConfiguration
//配置事务的回滚,对数据库的增删改都会回滚,便于测试用例的循环利用
@TransactionConfiguration(transactionManager="transactionManager",defaultRollback=true)
@Transactional
@ContextConfiguration(locations = {"classpath:spring.xml","classpath:spring-hibernate.xml"})
public class AbstractContextControllerTests {
@Autowired
protected WebApplicationContext wac;
}
具体测试类
package com.pengtu.gsj;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import org.hibernate.SessionFactory;
import org.junit.Before;
import org.junit.Test;
import org.owasp.esapi.ESAPI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import com.pengtu.gsj.controller.BannerController;
import com.pengtu.gsj.dao.UserDao;
import com.pengtu.gsj.entity.app.User;
import com.pengtu.gsj.service.UserService;
public class EsapiTest extends AbstractContextControllerTests{
private MockMvc mockMvc;
//该方法在每个方法执行之前都会执行一遍
@Before
public void setUp() throws Exception {
mockMvc = MockMvcBuilders.standaloneSetup(new BannerController()).build();
}
/**
* perform:执行一个RequestBuilder请求,会自动执行SpringMVC的流程并映射到相应的控制器执行处理;
* get:声明发送一个get请求的方法。MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables):根据uri模板 和uri变量值得到一个GET请求方式的。另外提供了其他的请求的方法,如:post、put、delete等。
* param:添加request的参数,如上面发送请求的时候带上了了pcode = root的参数。假如使用需要发送json数据格式的时将不能使用这种 方式,可见后面被@ResponseBody注解参数的解决方法
* andExpect:添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确(对返回的数据进行的判断);
* andDo:添加ResultHandler结果处理器,比如调试时打印结果到控制台(对返回的数据进行的判断);
* andReturn:最后返回相应的MvcResult;然后进行自定义验证/进行下一步的异步处理(对返回的数据进行的判断)
* @throws Exception
*/
@Test
public void getAllBanners() throws Exception{
String responseString = mockMvc.perform(get("/banner/hello") //请求的url,请求的方法是get
.contentType(MediaType.APPLICATION_JSON) //数据的格式
.param("id","123456789") //添加参数
).andExpect(status().isOk()) //返回的状态是200
.andDo(print()) //打印出请求和相应的内容
.andReturn().getResponse().getContentAsString(); //将相应的数据转换为字符串
System.out.println("--------返回的json = " + responseString);
}
}
perform:执行一个RequestBuilder请求,会自动执行SpringMVC的流程并映射到相应的控制器执行处理;
get:声明发送一个get请求的方法。MockHttpServletRequestBuilder get(String urlTemplate, Object… urlVariables):根据uri模板和uri变量值得到一个GET请求方式的。另外提供了其他的请求的方法,如:post、put、delete等。
param:添加request的参数,如上面发送请求的时候带上了了pcode = root的参数。假如使用需要发送json数据格式的时将不能使用这种方式。
andExpect:添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确(对返回的数据进行的判断);
andDo:添加ResultHandler结果处理器,比如调试时打印结果到控制台(对返回的数据进行的判断);
andReturn:最后返回相应的MvcResult;然后进行自定义验证/进行下一步的异步处理(对返回的数据进行的判断)
SpringRunner和SpringJUnit4ClassRunner
SpringRunner 是 SpringJUnit4ClassRunner 的别名,两者没有任何区别
What is the difference between SpringJUnit4ClassRunner and SpringRunner
stackoverflow.com/questions/4…
Class SpringRunner
docs.spring.io/spring/docs…
spring boot单元测试
1、要让一个普通类变成一个单元测试类只需要在类名上加入 @SpringBootTest 和 @RunWith(SpringRunner.class) 两个注释即可。
2、在测试方法上加上 @Test 注释。
Spring Boot 单元测试详解+实战教程
www.cnblogs.com/javastack/p…
@SpringBootTest
@SpringBootTest 为 springApplication 创建上下文并支持 SpringBoot 特性
@SpringBootTest 注解告诉 SpringBoot 去寻找一个主配置类(例如带有 @SpringBootApplication 的配置类),并使用它来启动 Spring 应用程序上下文。SpringBootTest 加载完整的应用程序并注入所有可能的bean,因此速度会很慢。
在这种情况下,不需要创建 MockMvc bean,可以直接通过 RestTemplate 进行请求测试(或者使用 TestRestTemplate )。
使用 @SpringBootTest 的 webEnvironment 属性定义运行环境:
Mock(默认): 加载 WebApplicationContext 并提供模拟的 web 环境 Servlet环境,使用此批注时,不会启动嵌入式服务器
RANDOM_PORT: 加载 WebServerApplicationContext 并提供真实的 web 环境,嵌入式服务器,监听端口是随机的
DEFINED_PORT: 加载 WebServerApplicationContext 并提供真实的 Web 环境,嵌入式服务器启动并监听定义的端口(来自 application.properties 或默认端口 8080)
NONE: 使用 SpringApplication 加载 ApplicationContext 但不提供任何Web环境
Spring Test单元测试
jianwl.com/2016/08/07/…
Annotation Type SpringBootTest
docs.spring.io/spring-boot…
感谢诸君的观看,文中如有纰漏,欢迎在评论区来交流。如果这篇文章帮助到了你,欢迎点赞👍关注。