Spring框架单元测试

来源:互联网 发布:javascript计算器代码 编辑:程序博客网 时间:2024/06/06 03:05

测试普通java项目我们知道使用的是junit4进行单元测试,但是对于web项目该怎么做呢,总不能用服务器运行项目一个个测吧 那样过于麻烦,下面给出我的解决方式
Spring 为我们提供了MockMvc这个用于测试的类
@RunWith: 告诉Junit使用 Spring-Test 框架, 允许加载web 应用程序上下文。

@WebAppConfiguration: 表明该类会使用web应用程序的默认根目录来载入ApplicationContext, value = “src/main/webapp” 可以不填,默认此目录

@ContextConfiguration: 指定需要加载的spring配置文件的地址 (“file:src/main/resources/applicationContext.xml”)

@Autowired WebApplicationContext wac:注入web环境的ApplicationContext容器;

使用MockMvcBuilders.webAppContextSetup(wac).build()来创建一个MockMvc进行测试, 此为模拟真实的Spring MVC环境
Before test

初始化Mock对象, 通过MockMvcBuilders.standaloneSetup模拟一个Mvc测试环境,注入controller, 通过build得到一个MockMvc, 后面就用MockMvc的一些API做测试。

这不是真实的Spring MVC环境,如果要模拟真实环境需要用 MockMvcBuilders.webAppContextSetup(webApplicationContext).build()
但也可直接加载你要测试的Controller 就不需要webAppContextSetUp了
方法介绍:
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;然后进行自定义验证/进行下一步的异步处理(对返回的数据进行的判断)
下面给出我工作上 简单的测试demo

@RunWith(SpringJUnit4ClassRunner.class)@WebAppConfiguration@ContextConfiguration(locations = {"classpath:spring/spring-context.xml"})//不要重复加载public class CityWarehouseControllerTest {    @Resource    CityWarehouseController cityWarehouseController;    protected MockMvc mockMvc;    @Before    public void setUp() {        mockMvc = MockMvcBuilders.standaloneSetup(cityWarehouseController).build();    }    /*    * 测试城市列表 dongshuo test    * */    @Test    public void testCityData () throws Exception {        MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders                .post("/cityData")                .contentType(MediaType.APPLICATION_JSON_UTF8)                .accept(MediaType.APPLICATION_JSON_UTF8)).andReturn();        MockHttpServletResponse response = mvcResult.getResponse();        int status = response.getStatus();        String content = response.getContentAsString();        Assert.assertEquals(200,status);//请求状态是200 即为请求成功        Assert.assertNotNull(content);//返回值不为空        //System.out.println(content);//如果不为空,打印返回值    }}

但对与传进来的是@RequestBody 的javabean 就需要转为json 进行转化 可以到我的工具类里寻找 jsonutils

    /*    *  dongshuo test    * 测试SKU 实际销量预测销量图展示    *    * */    @Test    public void testChartForSKU () throws Exception {        SkuParamVo skuParamVo = new SkuParamVo();        skuParamVo.setWid("10002");        skuParamVo.setDcid("13");        skuParamVo.setForecastDays("1");        skuParamVo.setDateType("1");        String jsonParamVo = JsonUtil.objectToJson(skuParamVo);        String contentAsString = mockMvc.perform(MockMvcRequestBuilders                .post("/chartForSKU")                .contentType(MediaType.APPLICATION_JSON_UTF8)                .accept(MediaType.APPLICATION_JSON_UTF8)                .content(jsonParamVo))                .andExpect(MockMvcResultMatchers.status().isOk())                .andDo(MockMvcResultHandlers.print())                .andReturn().getResponse().getContentAsString();       // System.out.println("testChartForSKU:"+contentAsString);    }

期间出现了 servlet-api 不兼容问题
javax.servlet.http.HttpServletRequest.isAsyncStarted()Z

原创粉丝点击