springmvc mock单元测试

来源:互联网 发布:on淘宝旗舰店 编辑:程序博客网 时间:2024/05/22 18:23

  web项目在进行单元测试时,一般的做法是将项目部署到web容器中,通过HttpClient、或者浏览器对某一个功能进行测试,效率非常低。下面介绍下spring test提供的mock测试功能,可以非常方便地完成web项目的单元测试。
  首先写个测试父类,其它测试类只需要继承该父类即可。注意:可以通过编码的方式添加Filter过滤器,下面的示例代码中添加了SsoFilter拦截器。

/** * 使用mock测试web服务 * @author huangxf * @date 2017年4月12日 */@WebAppConfiguration(value="src/main/webapp")@ContextConfiguration( locations={"classpath*:spring-config/core/application-*.xml",         "classpath*:spring-config/core/springmvc-servlet.xml"} )@RunWith( SpringJUnit4ClassRunner.class )public class BaseControllerTest extends AbstractJUnit4SpringContextTests {    @Resource    protected WebApplicationContext wac;    protected MockMvc mockMvc;    @Before    public void beforeTest() {        Filter ssoFilter = new SsoFilter();        mockMvc = MockMvcBuilders.webAppContextSetup( wac ).addFilters( ssoFilter ).build();    }}

编写XXXTest继承BaseControllerTest,使用父类提供的mockMvc发起请求

/*** 使用mock对PaymentController服务进行测试* @author huangxf* @date 2017年4月12日*/public class PaymentControllerTest extends BaseControllerTest {    private Logger logger = LoggerFactory.getLogger( this.getClass() );    @Test    public void testQueryPayModes() throws Exception {        String json = "{data:{\"partnerId\":\"10000\",\"accessMode\":\"H5\"}}";        MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.                post("/pay/getPayModeList").contentType( MediaType.APPLICATION_JSON_UTF8 )                .accept( MediaType.APPLICATION_JSON_UTF8 );        requestBuilder.content( json );        //请求        MvcResult result = mockMvc.perform( requestBuilder )                .andDo( MockMvcResultHandlers.print() )                .andReturn();        //获取响应数据        String response = result.getResponse().getContentAsString();        logger.info( "====Response====\n{}", response );        //对数据进行解析        PaymentResponse<List<PayModeResp>> resp =                 JsonUtils.toBean( response, new TypeReference<DefaultResponse<List<PayModeResp>>>(){} );        assertEquals( resp.getRetCode(), "000000" );    }}