springmockMVC 测试controller

springmockMVC测试WEB Controller

1.应用场景:

    SSM框架大行天下的时候,伴随着测试驱动开发模式的盛行,springmvc 测试也是每个开发人员必须面对的问题。springMVC框架中有两种配置方式,一种是将主要的配置,例如数据层,服务层,和事务层放置在一个common.xml中,然后将mvc相关的配置放置在mvc的配置文件中,mvc_servlet.xml中。这种方式适用于大型项目的开发,易于扩展和维护;另外一种就是大家经常见到的只有一个springmvc.xml的配置,加载所有的bean和配置。优点是简单明了。

  2.测试方式

    因为是web层的测试,spring提供了spring-test的模块给大家使用,其中有关于web层有mockmvc的测试相关内容。

   第一种配置方式的测试:

    web.xml中的书写如图:


   

    


此种配置方式没有使用junit4与spring-test结合的方式,也就是大家经常用的 @RunWith(SpringJUnit4ClassRunner.class)  

@ContextConfiguration({"spring-context.xml"}) //加载配置文件。原因:

原因1.此处我需要使用的是MockMvcBuilders.webAppContextSetup(context).build()来初始化mockmvc,进而去执行测试的controller方法。

原因2.使用@ContextConfiguration加载不在classpath下的配置文件时总是会报文件找不到的问题,因为我们的mvc配置在WEB-INF下。

第二种配置方式的测试

 web.xml中的书写如图:


测试类

@RunWith(SpringJUnit4ClassRunner.class)  //使用junit4进行测试
@ContextConfiguration({"/config/springmvc-servlet.xml"}) //加载配置文件

public class MockMvcControllerTest {

private MockMvc mvc ;
@Test
public  void test() {


/*XmlWebApplicationContext context = new XmlWebApplicationContext();
context.setConfigLocations("file:src/sources/config/spring_common.xml",
"file:src/webapp/WEB-INF/springmvc-servlet.xml");
MockServletContext msc = new MockServletContext();
context.setServletContext(msc);
context.refresh();
msc.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, context);*/
/*mvc = MockMvcBuilders.webAppContextSetup(context).build();*/

mvc = MockMvcBuilders.standaloneSetup(new MyController()).build();
try {
Map<String , String> result = new HashMap<>();
result.put("flag", "success");
result.put("data", "hello");
String expected = JSON.toJSONString(result);
MvcResult mvcResult = mvc.perform(get("/test/hi.do"))
.andExpect(status().isOk())
// .andExpect(content().json(expected))
.andReturn();
System.out.println(mvcResult.getResponse().getContentAsString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

说明:MockMvcBuilders.standaloneSetup(new MyController()),中可以是多个controller。源码如下:

       public static StandaloneMockMvcBuilder standaloneSetup(Object... controllers) {
return new StandaloneMockMvcBuilder(controllers);
}

这种方式相比较于第一种简单很多,当然你也可以采用第一种方式,将配置文件配置进来,但是相对麻烦很多。

3.第一种测试配置方式的分析:

MockMvcBuilders.webAppContextSetup(context),源码如下


大意是使用给定的完全初始化的(例如执行过refreshed)的WebApplicationContext,spring的前端控制器将会使用这个上下文去发现spring mvc 框架和其中应用的控制层,这个上下文必须已经配置了一个servletcontext。

然后找下WebApplicationContext的层级图,如下


发现XmlWebApplicationContext比较适合我们使用,然后结合类说明去创建就行。


接着我们看下servletcontext的层级图:



以上说明就有了如下代码:

XmlWebApplicationContext context = new XmlWebApplicationContext();
context.setConfigLocations("file:src/sources/config/spring_common.xml",
"file:src/webapp/WEB-INF/springmvc-servlet.xml");
MockServletContext msc = new MockServletContext();
context.setServletContext(msc);
context.refresh();
msc.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, context);


猜你喜欢

转载自blog.csdn.net/tony_java_2017/article/details/80760806