背景:

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
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇