背景:
1、希望能在项目中针对controller层进行测试;
2、解决测试运行时,shiro找不到的问题;
3、解决默认每个测试操作都是独立的,session信息无法保存的问题;
4、解决单元测试方法执行顺序的问题。
直接上代码,上面各个问题的解决方法都在代码的注释中。
@RunWith(SpringRunner.class)
@SpringBootTest
public class BaseUnitTest {
@Autowired
protected WebApplicationContext context;
protected MockMvc mockMvc;
/**
* 解决使用shiro后,单元测试失败的问题
*/
@Before
public void setUp() {
DefaultMockMvcBuilder builder = MockMvcBuilders.webAppContextSetup(context);
//shiroFilter是在ShiroCOnfig中定义的bean名称
builder.addFilters((Filter) context.getBean("shiroFilter"));
mockMvc = builder.build();
}
}
@Slf4j
//指定单元测试时方法的执行顺序
@FixMethodOrder(value = MethodSorters.NAME_ASCENDING)
public class LoginControllerTest extends BaseUnitTest {
//给待测试的请求提供一个session,静态类型可以保证内容不被重置
static MockHttpSession session1 = new MockHttpSession();
@Test
/**
* ajaxLogin
*/
public void test1() throws Exception {
session1.setMaxInactiveInterval(3000);
UsernamePasswordToken bean = new UsernamePasswordToken();
bean.setUsername("test");
bean.setPassword("123".toCharArray());
log.info("ajaxLogin() 入参:" + JsonConvertUtil.objectToJson(bean));
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Origin", "127.0.0.1");
httpHeaders.add("Access-Control-Request-Headers", "");
MvcResult result = mockMvc
.perform(//执行一个RequestBuilder请求,返回ResultActions对象。
MockMvcRequestBuilders
.post("/login/ajaxLogin")//根据uri模板和uri变量值得到一个POST请求方式的MockHttpServletRequestBuilder
.accept(MediaType.APPLICATION_JSON)//请求头,Accept代表发送端(客户端)希望接收的数据类型
.session(session1)//发送端发送的session信息
.headers(httpHeaders)//发送端发送的header信息
.contentType(MediaType.APPLICATION_JSON)//实体头,Content-Type代表发送端(客户端|服务器)发送的实体数据的数据类型
.content(JsonConvertUtil.objectToJson(bean))//发送端发送的实体数据
)
.andExpect(//添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确。
MockMvcResultMatchers.status().isOk()//验证状态码
)
.andDo(//添加ResultHandler结果处理器,比如调试时打印结果到控制台。
MockMvcResultHandlers.print()//输出整个响应结果信息。
//new EncodingResultHandler()//自定义结果处理器
)
.andReturn();//最后返回相应的MvcResult,然后进行自定义验证/进行下一步的异步处理。
log.info("ajaxLogin() 出参:" + result.getResponse().getContentAsString());
}
@Test
/**
* generate
*/
public void test2() throws Exception {
session1.setMaxInactiveInterval(3000);
log.info("generate() 入参:");
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Origin", "127.0.0.1");
httpHeaders.add("Access-Control-Request-Headers", "");
MvcResult result = mockMvc
.perform(MockMvcRequestBuilders.get("/login/code")
.contentType(MediaType.APPLICATION_JSON)
.session(session1)
.headers(httpHeaders))
.andExpect(MockMvcResultMatchers.status().isOk()).andDo(new EncodingResultHandler()).andReturn();
log.info("generate() 出参:" + result.getResponse().getContentAsString());
}
@Test
/**
* logout
*/
public void test3() throws Exception {
session1.setMaxInactiveInterval(3000);
Integer mapId = 15;
log.info("logout() 入参:" + mapId);
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Origin", "127.0.0.1");
httpHeaders.add("Access-Control-Request-Headers", "");
MvcResult result = mockMvc
.perform(MockMvcRequestBuilders.post("/login/logout").accept((MediaType.APPLICATION_JSON))
.contentType(MediaType.APPLICATION_JSON)
.session(session1)
.headers(httpHeaders).param("mapId", mapId.toString()))
.andExpect(MockMvcResultMatchers.status().isOk()).andDo(new EncodingResultHandler()).andReturn();
log.info("logout() 出参:" + result.getResponse().getContentAsString());
}
}
最后修改于 2019-03-04 00:37:04
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

