日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

MockMVC

發(fā)布時(shí)間:2023/12/15 c/c++ 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MockMVC 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

隨著RESTful Web Service的流行,測(cè)試對(duì)外的Service是否滿足期望也變的必要的。從Spring 3.2開始Spring了Spring Web測(cè)試框架

?

Spring MVC測(cè)試框架提供了對(duì)服務(wù)器端和客戶端(基于RestTemplate的客戶端)提供了支持。

?

對(duì)于服務(wù)器端:在Spring 3.2之前,我們測(cè)試時(shí)一般都是直接new控制器,注入依賴,然后判斷返回值。但是我們無法連同Spring MVC的基礎(chǔ)設(shè)施(如DispatcherServlet調(diào)度、類型轉(zhuǎn)換、數(shù)據(jù)綁定、攔截器等)一起測(cè)試,另外也沒有現(xiàn)成的方法測(cè)試如最終渲染的視圖(@ResponseBody生成的JSON/XML、JSP、Velocity等)內(nèi)容是否正確。從Spring 3.2開始這些事情都可以完成了。而且可以測(cè)試完整的Spring MVC流程,即從URL請(qǐng)求到控制器處理,再到視圖渲染都可以測(cè)試。

?

對(duì)于客戶端:不需要啟動(dòng)服務(wù)器即可測(cè)試我們的RESTful 服務(wù)。

1 服務(wù)器端測(cè)試

我的環(huán)境:JDK7、Maven3、spring4、Servlet3

?

首先添加依賴

如下是spring-context和spring-webmvc依賴:

Java代碼??
  • <dependency>??
  • ????<groupId>org.springframework</groupId>??
  • ????<artifactId>spring-context</artifactId>??
  • ????<version>${spring.version}</version>??
  • </dependency>??
  • ??
  • <dependency>??
  • ????<groupId>org.springframework</groupId>??
  • ????<artifactId>spring-webmvc</artifactId>??
  • ????<version>${spring.version}</version>??
  • </dependency>??
  • 版本信息:<spring.version>4.0.0.RELEASE</spring.version>

    ?

    如下是測(cè)試相關(guān)的依賴(junit、hamcrest、mockito、spring-test):

    Java代碼??
  • <dependency>??
  • ????<groupId>junit</groupId>??
  • ????<artifactId>junit</artifactId>??
  • ????<version>${junit.version}</version>??
  • ????<scope>test</scope>??
  • </dependency>??
  • ??
  • <dependency>??
  • ????<groupId>org.hamcrest</groupId>??
  • ????<artifactId>hamcrest-core</artifactId>??
  • ????<version>${hamcrest.core.version}/version>??
  • ????<scope>test</scope>??
  • </dependency>??
  • <dependency>??
  • ????<groupId>org.mockito</groupId>??
  • ????<artifactId>mockito-core</artifactId>??
  • ????<version>${mockito.core.version}</version>??
  • ????<scope>test</scope>??
  • </dependency>??
  • ??
  • <dependency>??
  • ????<groupId>org.springframework</groupId>??
  • ????<artifactId>spring-test</artifactId>??
  • ????<version>${spring.version}</version>??
  • ????<scope>test</scope>??
  • </dependency>??
  • 版本信息:<junit.version>4.11</junit.version>、<hamcrest.core.version>1.3</hamcrest.core.version>、<mockito.core.version>1.9.5</mockito.core.version>

    然后準(zhǔn)備測(cè)試相關(guān)配置

    實(shí)體:

    Java代碼??
  • package?com.sishuok.mvc.entity;??
  • import?java.io.Serializable;??
  • public?class?User?implements?Serializable?{??
  • ????private?Long?id;??
  • ????private?String?name;??
  • ????//省略getter/setter等??
  • }??
  • ?

    控制器:

    Java代碼??
  • package?com.sishuok.mvc.controller;??
  • //省略import??
  • @Controller??
  • @RequestMapping("/user")??
  • public?class?UserController?{??
  • ??
  • ????@RequestMapping("/{id}")??
  • ????public?ModelAndView?view(@PathVariable("id")?Long?id,?HttpServletRequest?req)?{??
  • ????????User?user?=?new?User();??
  • ????????user.setId(id);??
  • ????????user.setName("zhang");??
  • ??
  • ????????ModelAndView?mv?=?new?ModelAndView();??
  • ????????mv.addObject("user",?user);??
  • ????????mv.setViewName("user/view");??
  • ????????return?mv;??
  • ????}??
  • }??
  • ?

    XML風(fēng)格配置:

    spring-config.xml:加載非web層組件?

    Java代碼??
  • <?xml?version="1.0"?encoding="UTF-8"?>??
  • <beans?xmlns="http://www.springframework.org/schema/beans"??
  • ???????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  • ???????xmlns:context="http://www.springframework.org/schema/context"??
  • ???????xsi:schemaLocation="??
  • ???????http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans.xsd??
  • ???????http://www.springframework.org/schema/context?http://www.springframework.org/schema/context/spring-context.xsd??
  • ???????">??
  • ????<!--?通過web.xml中的?org.springframework.web.context.ContextLoaderListener?加載的??-->??
  • ????<!--?請(qǐng)參考?http://jinnianshilongnian.iteye.com/blog/1602617??-->??
  • ????<context:component-scan?base-package="com.sishuok.mvc">??
  • ????????<context:exclude-filter?type="annotation"?expression="org.springframework.stereotype.Controller"/>??
  • ????</context:component-scan>??
  • </beans>??
  • ?

    spring-mvc.xml:加載和配置web層組件?

    Java代碼??
  • <?xml?version="1.0"?encoding="UTF-8"?>??
  • <beans?xmlns="http://www.springframework.org/schema/beans"??
  • ???????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  • ???????xmlns:context="http://www.springframework.org/schema/context"??
  • ???????xmlns:mvc="http://www.springframework.org/schema/mvc"??
  • ???????xsi:schemaLocation="??
  • ???????http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans.xsd??
  • ???????http://www.springframework.org/schema/context?http://www.springframework.org/schema/context/spring-context.xsd??
  • ???????http://www.springframework.org/schema/mvc?http://www.springframework.org/schema/mvc/spring-mvc.xsd??
  • ???????">??
  • ????<!--?通過web.xml中的?org.springframework.web.servlet.DispatcherServlet?加載的??-->??
  • ????<!--?請(qǐng)參考?http://jinnianshilongnian.iteye.com/blog/1602617??-->??
  • ????<context:component-scan?base-package="com.sishuok.mvc"?use-default-filters="false">??
  • ????????<context:include-filter?type="annotation"?expression="org.springframework.stereotype.Controller"/>??
  • ????</context:component-scan>??
  • ????<mvc:annotation-driven/>??
  • ????<bean?id="viewResolver"?class="org.springframework.web.servlet.view.InternalResourceViewResolver">??
  • ????????<property?name="prefix"?value="/WEB-INF/jsp/"/>??
  • ????????<property?name="suffix"?value=".jsp"/>??
  • ????</bean>??
  • </beans> ?
  • web.xml配置

    ?

    [html]?view plaincopy
  • <?xml?version="1.0"?encoding="UTF-8"?>??
  • <web-app??
  • ????????xmlns="http://java.sun.com/xml/ns/javaee"??
  • ????????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  • ????????xsi:schemaLocation="http://java.sun.com/xml/ns/javaee?http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"??
  • ????????version="3.0"??
  • ????????metadata-complete="false">??
  • ??
  • ????<!--?請(qǐng)禁用com.sishuok.config.WebInitializer后開啟如下配置?-->??
  • ??
  • ????<!--?Spring配置文件開始??-->??
  • ????<context-param>??
  • ????????<param-name>contextConfigLocation</param-name>??
  • ????????<param-value>??
  • ????????????classpath:spring-config.xml??
  • ????????</param-value>??
  • ????</context-param>??
  • ????<listener>??
  • ????????<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>??
  • ????</listener>??
  • ????<!--?Spring配置文件結(jié)束?-->??
  • ??
  • ????<!--?設(shè)置servlet編碼開始?-->??
  • ????<filter>??
  • ????????<filter-name>Set?Character?Encoding</filter-name>??
  • ????????<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>??
  • ????????<async-supported>true</async-supported>??
  • ????????<init-param>??
  • ????????????<param-name>encoding</param-name>??
  • ????????????<param-value>UTF-8</param-value>??
  • ????????</init-param>??
  • ????????<init-param>??
  • ????????????<param-name>forceEncoding</param-name>??
  • ????????????<param-value>true</param-value>??
  • ????????</init-param>??
  • ????</filter>??
  • ????<filter-mapping>??
  • ????????<filter-name>Set?Character?Encoding</filter-name>??
  • ????????<url-pattern>/*</url-pattern>??
  • ????</filter-mapping>??
  • ????<!--?設(shè)置servlet編碼結(jié)束?-->??
  • ??
  • ????<servlet>??
  • ????????<servlet-name>spring</servlet-name>??
  • ????????<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>??
  • ????????<init-param>??
  • ????????????<param-name>contextConfigLocation</param-name>??
  • ????????????<param-value>classpath:spring-mvc.xml</param-value>??
  • ????????</init-param>??
  • ????????<load-on-startup>1</load-on-startup>??
  • ????????<async-supported>true</async-supported>??
  • ????</servlet>??
  • ????<servlet-mapping>??
  • ????????<servlet-name>spring</servlet-name>??
  • ????????<url-pattern>/</url-pattern>??
  • ????</servlet-mapping>??
  • ??
  • ??
  • </web-app>??
  • ?

    等價(jià)的注解風(fēng)格配置:?

    AppConfig.java:等價(jià)于spring-config.xml

    Java代碼??
  • package?com.sishuok.config;??
  • ??
  • import?org.springframework.context.annotation.ComponentScan;??
  • import?org.springframework.context.annotation.Configuration;??
  • import?org.springframework.context.annotation.FilterType;??
  • import?org.springframework.stereotype.Controller;??
  • ??
  • @Configuration??
  • @ComponentScan(basePackages?=?"com.sishuok.mvc",?excludeFilters?=?{??
  • ????????@ComponentScan.Filter(type?=?FilterType.ANNOTATION,?value?=?{Controller.class})??
  • })??
  • public?class?AppConfig?{??
  • }??
  • ?

    MvcConfig.java:等價(jià)于spring-mvc.xml

    Java代碼??
  • package?com.sishuok.config;??
  • ??
  • import?org.springframework.context.annotation.Bean;??
  • import?org.springframework.context.annotation.ComponentScan;??
  • import?org.springframework.context.annotation.Configuration;??
  • import?org.springframework.context.annotation.FilterType;??
  • import?org.springframework.stereotype.Controller;??
  • import?org.springframework.web.servlet.ViewResolver;??
  • import?org.springframework.web.servlet.config.annotation.EnableWebMvc;??
  • import?org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;??
  • import?org.springframework.web.servlet.view.InternalResourceViewResolver;??
  • ??
  • @Configuration??
  • @EnableWebMvc??
  • @ComponentScan(basePackages?=?"com.sishuok.mvc",?useDefaultFilters?=?false,?includeFilters?=?{??
  • ????????@ComponentScan.Filter(type?=?FilterType.ANNOTATION,?value?=?{Controller.class})??
  • })??
  • public?class?MvcConfig?extends?WebMvcConfigurationSupport?{??
  • ??
  • ????@Bean??
  • ????public?ViewResolver?viewResolver()?{??
  • ????????InternalResourceViewResolver?viewResolver?=?new?InternalResourceViewResolver();??
  • ????????viewResolver.setPrefix("/WEB-INF/jsp/");??
  • ????????viewResolver.setSuffix(".jsp");??
  • ????????return?viewResolver;??
  • ????}??
  • ??
  • }??

  • WebInitializer.java:注冊(cè)相應(yīng)的web.xml中的組件

    Java代碼??
  • package?com.sishuok.config;??
  • ??
  • import?org.springframework.web.WebApplicationInitializer;??
  • import?org.springframework.web.context.ContextLoaderListener;??
  • import?org.springframework.web.context.support.AnnotationConfigWebApplicationContext;??
  • import?org.springframework.web.filter.CharacterEncodingFilter;??
  • import?org.springframework.web.servlet.DispatcherServlet;??
  • ??
  • import?javax.servlet.DispatcherType;??
  • import?javax.servlet.FilterRegistration;??
  • import?javax.servlet.ServletException;??
  • import?javax.servlet.ServletRegistration;??
  • import?java.util.EnumSet;??
  • ??
  • public?class?WebInitializer?implements?WebApplicationInitializer?{??
  • ??
  • ????@Override??
  • ????public?void?onStartup(javax.servlet.ServletContext?sc)?throws?ServletException?{??
  • ??
  • ????????AnnotationConfigWebApplicationContext?rootContext?=?new?AnnotationConfigWebApplicationContext();??
  • ????????rootContext.register(AppConfig.class);??
  • ????????sc.addListener(new?ContextLoaderListener(rootContext));??
  • ??
  • ????????//2、springmvc上下文??
  • ????????AnnotationConfigWebApplicationContext?springMvcContext?=?new?AnnotationConfigWebApplicationContext();??
  • ????????springMvcContext.register(MvcConfig.class);??
  • ????????//3、DispatcherServlet??
  • ????????DispatcherServlet?dispatcherServlet?=?new?DispatcherServlet(springMvcContext);??
  • ????????ServletRegistration.Dynamic?dynamic?=?sc.addServlet("dispatcherServlet",?dispatcherServlet);??
  • ????????dynamic.setLoadOnStartup(1);??
  • ????????dynamic.addMapping("/");??
  • ??
  • ????????//4、CharacterEncodingFilter??
  • ????????CharacterEncodingFilter?characterEncodingFilter?=?new?CharacterEncodingFilter();??
  • ????????characterEncodingFilter.setEncoding("utf-8");??
  • ????????FilterRegistration?filterRegistration?=??
  • ????????????????sc.addFilter("characterEncodingFilter",?characterEncodingFilter);??
  • ????????filterRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST),?false,?"/");??
  • ??
  • ????}??
  • }??
  • ?

    到此基本的配置就搞定了,接下來看看如何測(cè)試吧。?

    1.1 安裝測(cè)試環(huán)境

    spring mvc測(cè)試框架提供了兩種方式,獨(dú)立安裝和集成Web環(huán)境測(cè)試(此種方式并不會(huì)集成真正的web環(huán)境,而是通過相應(yīng)的Mock API進(jìn)行模擬測(cè)試,無須啟動(dòng)服務(wù)器)。

    ?

    獨(dú)立測(cè)試方式

    Java代碼??
  • public?class?UserControllerStandaloneSetupTest?{??
  • ????private?MockMvc?mockMvc;??
  • ????@Before??
  • ????public?void?setUp()?{??
  • ????????UserController?userController?=?new?UserController();??
  • ????????mockMvc?=?MockMvcBuilders.standaloneSetup(userController).build();??
  • ????}??
  • }??
  • 1、首先自己創(chuàng)建相應(yīng)的控制器,注入相應(yīng)的依賴

    2、通過MockMvcBuilders.standaloneSetup模擬一個(gè)Mvc測(cè)試環(huán)境,通過build得到一個(gè)MockMvc

    3、MockMvc:是我們以后測(cè)試時(shí)經(jīng)常使用的API,后邊介紹

    ?

    集成Web環(huán)境方式

    Java代碼??
  • //XML風(fēng)格??
  • @RunWith(SpringJUnit4ClassRunner.class)??
  • @WebAppConfiguration(value?=?"src/main/webapp")??
  • @ContextHierarchy({??
  • ????????@ContextConfiguration(name?=?"parent",?locations?=?"classpath:spring-config.xml"),??
  • ????????@ContextConfiguration(name?=?"child",?locations?=?"classpath:spring-mvc.xml")??
  • })??
  • ??
  • //注解風(fēng)格??
  • //@RunWith(SpringJUnit4ClassRunner.class)??
  • //@WebAppConfiguration(value?=?"src/main/webapp")??
  • //@ContextHierarchy({??
  • //????????@ContextConfiguration(name?=?"parent",?classes?=?AppConfig.class),??
  • //????????@ContextConfiguration(name?=?"child",?classes?=?MvcConfig.class)??
  • //})??
  • public?class?UserControllerWebAppContextSetupTest?{??
  • ??
  • ????@Autowired??
  • ????private?WebApplicationContext?wac;??
  • ????private?MockMvc?mockMvc;??
  • ??
  • ????@Before??
  • ????public?void?setUp()?{??
  • ????????mockMvc?=?MockMvcBuilders.webAppContextSetup(wac).build();??
  • ????}??
  • }??
  • 1、@WebAppConfiguration:測(cè)試環(huán)境使用,用來表示測(cè)試環(huán)境使用的ApplicationContext將是WebApplicationContext類型的;value指定web應(yīng)用的根;

    2、@ContextHierarchy:指定容器層次,即spring-config.xml是父容器,而spring-mvc.xml是子容器

    3、通過@Autowired?WebApplicationContext wac:注入web環(huán)境的ApplicationContext容器;

    4、然后通過MockMvcBuilders.webAppContextSetup(wac).build()創(chuàng)建一個(gè)MockMvc進(jìn)行測(cè)試;

    ?

    到此測(cè)試環(huán)境就搭建完成了,根據(jù)需要選擇使用哪種方式即可。

    ?

    1.2、HelloWorld

    Java代碼??
  • @Test??
  • public?void?testView()?throws?Exception?{??
  • ????MvcResult?result?=?mockMvc.perform(MockMvcRequestBuilders.get("/user/1"))??
  • ????????????.andExpect(MockMvcResultMatchers.view().name("user/view"))??
  • ????????????.andExpect(MockMvcResultMatchers.model().attributeExists("user"))??
  • ????????????.andDo(MockMvcResultHandlers.print())??
  • ????????????.andReturn();??
  • ??????
  • ????Assert.assertNotNull(result.getModelAndView().getModel().get("user"));??
  • }??
  • 1、mockMvc.perform執(zhí)行一個(gè)請(qǐng)求;

    2、MockMvcRequestBuilders.get("/user/1")構(gòu)造一個(gè)請(qǐng)求

    3、ResultActions.andExpect添加執(zhí)行完成后的斷言

    4、ResultActions.andDo添加一個(gè)結(jié)果處理器,表示要對(duì)結(jié)果做點(diǎn)什么事情,比如此處使用MockMvcResultHandlers.print()輸出整個(gè)響應(yīng)結(jié)果信息。

    5、ResultActions.andReturn表示執(zhí)行完成后返回相應(yīng)的結(jié)果。

    ?

    整個(gè)測(cè)試過程非常有規(guī)律:

    1、準(zhǔn)備測(cè)試環(huán)境

    2、通過MockMvc執(zhí)行請(qǐng)求

    3.1、添加驗(yàn)證斷言

    3.2、添加結(jié)果處理器

    3.3、得到MvcResult進(jìn)行自定義斷言/進(jìn)行下一步的異步請(qǐng)求

    4、卸載測(cè)試環(huán)境

    ?

    ?

    1.4、了解測(cè)試API

    Spring mvc測(cè)試框架提供了測(cè)試MVC需要的API,主要包括Servlet/JSP Mock、MockMvcBuilder、MockMvc、RequestBuilder、ResultMatcher、ResultHandler、MvcResult等。另外提供了幾個(gè)靜態(tài)工廠方法便于測(cè)試:MockMvcBuilders、MockMvcRequestBuilders、MockMvcResultMatchers、MockMvcResultHandlers。在使用時(shí)請(qǐng)使用靜態(tài)方法導(dǎo)入方便測(cè)試,如:

    Java代碼??
  • import?static?org.springframework.test.web.servlet.setup.MockMvcBuilders.*;??
  • import?static?org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;??
  • import?static?org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;??
  • import?static?org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;??
  • ?

    Servlet/JSP API Mock?

    提供了對(duì)Servlet 3 相應(yīng)API的Mock,如:

    MockServletContext

    MockHttpServletRequest

    MockHttpServletResponse

    ……

    具體請(qǐng)查看spring-test模塊的org.springframework.mock.web包。

    ?

    ?

    MockMvcBuilder/MockMvcBuilders

    MockMvcBuilder是用來構(gòu)造MockMvc的構(gòu)造器,其主要有兩個(gè)實(shí)現(xiàn):StandaloneMockMvcBuilder和DefaultMockMvcBuilder,分別對(duì)應(yīng)之前的兩種測(cè)試方式。對(duì)于我們來說直接使用靜態(tài)工廠MockMvcBuilders創(chuàng)建即可:

    MockMvcBuilders.webAppContextSetup(WebApplicationContext context):指定WebApplicationContext,將會(huì)從該上下文獲取相應(yīng)的控制器并得到相應(yīng)的MockMvc;

    MockMvcBuilders.standaloneSetup(Object... controllers):通過參數(shù)指定一組控制器,這樣就不需要從上下文獲取了;

    ?

    其中DefaultMockMvcBuilder還提供了如下API:

    addFilters(Filter... filters)/addFilter(Filter filter, String... urlPatterns):添加javax.servlet.Filter過濾器

    defaultRequest(RequestBuilder requestBuilder):默認(rèn)的RequestBuilder,每次執(zhí)行時(shí)會(huì)合并到自定義的RequestBuilder中,即提供公共請(qǐng)求數(shù)據(jù)的;

    alwaysExpect(ResultMatcher resultMatcher):定義全局的結(jié)果驗(yàn)證器,即每次執(zhí)行請(qǐng)求時(shí)都進(jìn)行驗(yàn)證的規(guī)則;

    alwaysDo(ResultHandler resultHandler):定義全局結(jié)果處理器,即每次請(qǐng)求時(shí)都進(jìn)行結(jié)果處理;

    dispatchOptions:DispatcherServlet是否分發(fā)OPTIONS請(qǐng)求方法到控制器;

    ?

    StandaloneMockMvcBuilder繼承了DefaultMockMvcBuilder,又提供了如下API:

    setMessageConverters(HttpMessageConverter<?>...messageConverters):設(shè)置HTTP消息轉(zhuǎn)換器;

    setValidator(Validator validator):設(shè)置驗(yàn)證器;

    setConversionService(FormattingConversionService conversionService):設(shè)置轉(zhuǎn)換服務(wù);

    addInterceptors(HandlerInterceptor... interceptors)/addMappedInterceptors(String[] pathPatterns, HandlerInterceptor... interceptors):添加spring mvc攔截器;

    setContentNegotiationManager(ContentNegotiationManager contentNegotiationManager):設(shè)置內(nèi)容協(xié)商管理器;

    setAsyncRequestTimeout(long timeout):設(shè)置異步超時(shí)時(shí)間;

    setCustomArgumentResolvers(HandlerMethodArgumentResolver... argumentResolvers):設(shè)置自定義控制器方法參數(shù)解析器;

    setCustomReturnValueHandlers(HandlerMethodReturnValueHandler... handlers):設(shè)置自定義控制器方法返回值處理器;

    setHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers)/setHandlerExceptionResolvers(HandlerExceptionResolver... exceptionResolvers):設(shè)置異常解析器;

    setViewResolvers(ViewResolver...resolvers):設(shè)置視圖解析器;

    setSingleView(View view):設(shè)置單個(gè)視圖,即視圖解析時(shí)總是解析到這一個(gè)(僅適用于只有一個(gè)視圖的情況);

    setLocaleResolver(LocaleResolver localeResolver):設(shè)置Local解析器;

    setFlashMapManager(FlashMapManager flashMapManager):設(shè)置FlashMapManager,如存儲(chǔ)重定向數(shù)據(jù);

    setUseSuffixPatternMatch(boolean useSuffixPatternMatch):設(shè)置是否是后綴模式匹配,如“/user”是否匹配"/user.*",默認(rèn)真即匹配;

    setUseTrailingSlashPatternMatch(boolean useTrailingSlashPatternMatch):設(shè)置是否自動(dòng)后綴路徑模式匹配,如“/user”是否匹配“/user/”,默認(rèn)真即匹配;

    addPlaceHolderValue(String name, String value) :添加request mapping中的占位符替代;

    ?

    因?yàn)镾tandaloneMockMvcBuilder不會(huì)加載Spring MVC配置文件,因此就不會(huì)注冊(cè)我們需要的一些組件,因此就提供了如上API用于注冊(cè)我們需要的相應(yīng)組件。

    ?

    MockMvc

    使用之前的MockMvcBuilder.build()得到構(gòu)建好的MockMvc;這個(gè)是mvc測(cè)試的核心API,對(duì)于該API的使用方式如下:

    Java代碼??
  • MvcResult?result?=?mockMvc.perform(MockMvcRequestBuilders.get("/user/1"))??
  • ???????.andExpect(MockMvcResultMatchers.view().name("user/view"))??
  • ???????.andExpect(MockMvcResultMatchers.model().attributeExists("user"))??
  • ???????.andDo(MockMvcResultHandlers.print())??
  • ???????.andReturn();??
  • perform:執(zhí)行一個(gè)RequestBuilder請(qǐng)求,會(huì)自動(dòng)執(zhí)行SpringMVC的流程并映射到相應(yīng)的控制器執(zhí)行處理;

    andExpect:添加ResultMatcher驗(yàn)證規(guī)則,驗(yàn)證控制器執(zhí)行完成后結(jié)果是否正確;

    andDo:添加ResultHandler結(jié)果處理器,比如調(diào)試時(shí)打印結(jié)果到控制臺(tái);

    andReturn:最后返回相應(yīng)的MvcResult;然后進(jìn)行自定義驗(yàn)證/進(jìn)行下一步的異步處理;

    ?

    另外還提供了以下API:

    setDefaultRequest:設(shè)置默認(rèn)的RequestBuilder,用于在每次perform執(zhí)行相應(yīng)的RequestBuilder時(shí)自動(dòng)把該默認(rèn)的RequestBuilder合并到perform的RequestBuilder中;

    setGlobalResultMatchers:設(shè)置全局的預(yù)期結(jié)果驗(yàn)證規(guī)則,如我們通過MockMvc測(cè)試多個(gè)控制器時(shí),假設(shè)它們都想驗(yàn)證某個(gè)規(guī)則時(shí),就可以使用這個(gè);

    setGlobalResultHandlers:設(shè)置全局的ResultHandler結(jié)果處理器;

    ??

    RequestBuilder/MockMvcRequestBuilders

    從名字可以看出,RequestBuilder用來構(gòu)建請(qǐng)求的,其提供了一個(gè)方法buildRequest(ServletContext servletContext)用于構(gòu)建MockHttpServletRequest;其主要有兩個(gè)子類MockHttpServletRequestBuilder和MockMultipartHttpServletRequestBuilder(如文件上傳使用),即用來Mock客戶端請(qǐng)求需要的所有數(shù)據(jù)。

    ?

    MockMvcRequestBuilders主要API:

    MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables):根據(jù)uri模板和uri變量值得到一個(gè)GET請(qǐng)求方式的MockHttpServletRequestBuilder;如get("/user/{id}", 1L);

    MockHttpServletRequestBuilder post(String urlTemplate, Object... urlVariables):同get類似,但是是POST方法;

    MockHttpServletRequestBuilder put(String urlTemplate, Object... urlVariables):同get類似,但是是PUT方法;

    MockHttpServletRequestBuilder delete(String urlTemplate, Object... urlVariables) :同get類似,但是是DELETE方法;

    MockHttpServletRequestBuilder options(String urlTemplate, Object... urlVariables):同get類似,但是是OPTIONS方法;

    MockHttpServletRequestBuilder request(HttpMethod httpMethod, String urlTemplate, Object... urlVariables):提供自己的Http請(qǐng)求方法及uri模板和uri變量,如上API都是委托給這個(gè)API;

    MockMultipartHttpServletRequestBuilder fileUpload(String urlTemplate, Object... urlVariables):提供文件上傳方式的請(qǐng)求,得到MockMultipartHttpServletRequestBuilder;

    RequestBuilder asyncDispatch(final MvcResult mvcResult):創(chuàng)建一個(gè)從啟動(dòng)異步處理的請(qǐng)求的MvcResult進(jìn)行異步分派的RequestBuilder;

    ?

    接下來再看看MockHttpServletRequestBuilder和MockMultipartHttpServletRequestBuilder API:

    MockHttpServletRequestBuilder API:

    MockHttpServletRequestBuilder header(String name, Object... values)/MockHttpServletRequestBuilder headers(HttpHeaders httpHeaders):添加頭信息;

    MockHttpServletRequestBuilder contentType(MediaType mediaType):指定請(qǐng)求的contentType頭信息;

    MockHttpServletRequestBuilder accept(MediaType... mediaTypes)/MockHttpServletRequestBuilder accept(String... mediaTypes):指定請(qǐng)求的Accept頭信息;

    MockHttpServletRequestBuilder content(byte[] content)/MockHttpServletRequestBuilder content(String content):指定請(qǐng)求Body體內(nèi)容;

    MockHttpServletRequestBuilder cookie(Cookie... cookies):指定請(qǐng)求的Cookie;

    MockHttpServletRequestBuilder locale(Locale locale):指定請(qǐng)求的Locale;

    MockHttpServletRequestBuilder characterEncoding(String encoding):指定請(qǐng)求字符編碼;

    MockHttpServletRequestBuilder requestAttr(String name, Object value) :設(shè)置請(qǐng)求屬性數(shù)據(jù);

    MockHttpServletRequestBuilder sessionAttr(String name, Object value)/MockHttpServletRequestBuilder sessionAttrs(Map<String, Object> sessionAttributes):設(shè)置請(qǐng)求session屬性數(shù)據(jù);

    MockHttpServletRequestBuilder flashAttr(String name, Object value)/MockHttpServletRequestBuilder flashAttrs(Map<String, Object> flashAttributes):指定請(qǐng)求的flash信息,比如重定向后的屬性信息;

    MockHttpServletRequestBuilder session(MockHttpSession session) :指定請(qǐng)求的Session;

    MockHttpServletRequestBuilder principal(Principal principal) :指定請(qǐng)求的Principal;

    MockHttpServletRequestBuilder contextPath(String contextPath) :指定請(qǐng)求的上下文路徑,必須以“/”開頭,且不能以“/”結(jié)尾;

    MockHttpServletRequestBuilder pathInfo(String pathInfo) :請(qǐng)求的路徑信息,必須以“/”開頭;

    MockHttpServletRequestBuilder secure(boolean secure):請(qǐng)求是否使用安全通道;

    MockHttpServletRequestBuilder with(RequestPostProcessor postProcessor):請(qǐng)求的后處理器,用于自定義一些請(qǐng)求處理的擴(kuò)展點(diǎn);

    ?

    MockMultipartHttpServletRequestBuilder繼承自MockHttpServletRequestBuilder,又提供了如下API:

    MockMultipartHttpServletRequestBuilder file(String name, byte[] content)/MockMultipartHttpServletRequestBuilder file(MockMultipartFile file):指定要上傳的文件;

    ?

    ResultActions

    調(diào)用MockMvc.perform(RequestBuilder requestBuilder)后將得到ResultActions,通過ResultActions完成如下三件事:

    ResultActions andExpect(ResultMatcher matcher) :添加驗(yàn)證斷言來判斷執(zhí)行請(qǐng)求后的結(jié)果是否是預(yù)期的;

    ResultActions andDo(ResultHandler handler) :添加結(jié)果處理器,用于對(duì)驗(yàn)證成功后執(zhí)行的動(dòng)作,如輸出下請(qǐng)求/結(jié)果信息用于調(diào)試;

    MvcResult andReturn() :返回驗(yàn)證成功后的MvcResult;用于自定義驗(yàn)證/下一步的異步處理;

    ?

    ResultMatcher/MockMvcResultMatchers

    ResultMatcher用來匹配執(zhí)行完請(qǐng)求后的結(jié)果驗(yàn)證,其就一個(gè)match(MvcResult result)斷言方法,如果匹配失敗將拋出相應(yīng)的異常;spring mvc測(cè)試框架提供了很多***ResultMatchers來滿足測(cè)試需求。注意這些***ResultMatchers并不是ResultMatcher的子類,而是返回ResultMatcher實(shí)例的。Spring mvc測(cè)試框架為了測(cè)試方便提供了MockMvcResultMatchers靜態(tài)工廠方法方便操作;具體的API如下:

    HandlerResultMatchers handler():請(qǐng)求的Handler驗(yàn)證器,比如驗(yàn)證處理器類型/方法名;此處的Handler其實(shí)就是處理請(qǐng)求的控制器;

    RequestResultMatchers request():得到RequestResultMatchers驗(yàn)證器;

    ModelResultMatchers model():得到模型驗(yàn)證器;

    ViewResultMatchers view():得到視圖驗(yàn)證器;

    FlashAttributeResultMatchers flash():得到Flash屬性驗(yàn)證;

    StatusResultMatchers status():得到響應(yīng)狀態(tài)驗(yàn)證器;

    HeaderResultMatchers header():得到響應(yīng)Header驗(yàn)證器;

    CookieResultMatchers cookie():得到響應(yīng)Cookie驗(yàn)證器;

    ContentResultMatchers content():得到響應(yīng)內(nèi)容驗(yàn)證器;

    JsonPathResultMatchers jsonPath(String expression, Object ... args)/ResultMatcher jsonPath(String expression, Matcher<T> matcher):得到Json表達(dá)式驗(yàn)證器;

    XpathResultMatchers xpath(String expression, Object... args)/XpathResultMatchers xpath(String expression, Map<String, String> namespaces, Object... args):得到Xpath表達(dá)式驗(yàn)證器;

    ResultMatcher forwardedUrl(final String expectedUrl):驗(yàn)證處理完請(qǐng)求后轉(zhuǎn)發(fā)的url(絕對(duì)匹配);

    ResultMatcher forwardedUrlPattern(final String urlPattern):驗(yàn)證處理完請(qǐng)求后轉(zhuǎn)發(fā)的url(Ant風(fēng)格模式匹配,@since spring4);

    ResultMatcher redirectedUrl(final String expectedUrl):驗(yàn)證處理完請(qǐng)求后重定向的url(絕對(duì)匹配);

    ResultMatcher redirectedUrlPattern(final String expectedUrl):驗(yàn)證處理完請(qǐng)求后重定向的url(Ant風(fēng)格模式匹配,@since spring4);

    ?

    得到相應(yīng)的***ResultMatchers后,接著再調(diào)用其相應(yīng)的API得到ResultMatcher,如ModelResultMatchers.attributeExists(final String... names)判斷Model屬性是否存在。具體請(qǐng)查看相應(yīng)的API。再次就不一一列舉了。

    ?

    ?

    ResultHandler/MockMvcResultHandlers

    ResultHandler用于對(duì)處理的結(jié)果進(jìn)行相應(yīng)處理的,比如輸出整個(gè)請(qǐng)求/響應(yīng)等信息方便調(diào)試,Spring mvc測(cè)試框架提供了MockMvcResultHandlers靜態(tài)工廠方法,該工廠提供了ResultHandler print()返回一個(gè)輸出MvcResult詳細(xì)信息到控制臺(tái)的ResultHandler實(shí)現(xiàn)。

    ?

    ?

    MvcResult

    即執(zhí)行完控制器后得到的整個(gè)結(jié)果,并不僅僅是返回值,其包含了測(cè)試時(shí)需要的所有信息,如:

    MockHttpServletRequest getRequest():得到執(zhí)行的請(qǐng)求;

    MockHttpServletResponse getResponse():得到執(zhí)行后的響應(yīng);

    Object getHandler():得到執(zhí)行的處理器,一般就是控制器;

    HandlerInterceptor[] getInterceptors():得到對(duì)處理器進(jìn)行攔截的攔截器;

    ModelAndView getModelAndView():得到執(zhí)行后的ModelAndView;

    Exception getResolvedException():得到HandlerExceptionResolver解析后的異常;

    FlashMap getFlashMap():得到FlashMap;

    Object getAsyncResult()/Object getAsyncResult(long timeout):得到異步執(zhí)行的結(jié)果;

    ?

    1.5 測(cè)試示例

    測(cè)試普通控制器?

    Java代碼??
  • //測(cè)試普通控制器??
  • mockMvc.perform(get("/user/{id}",?1))?//執(zhí)行請(qǐng)求??
  • ????????.andExpect(model().attributeExists("user"))?//驗(yàn)證存儲(chǔ)模型數(shù)據(jù)??
  • ????????.andExpect(view().name("user/view"))?//驗(yàn)證viewName??
  • ????????.andExpect(forwardedUrl("/WEB-INF/jsp/user/view.jsp"))//驗(yàn)證視圖渲染時(shí)forward到的jsp??
  • ????????.andExpect(status().isOk())//驗(yàn)證狀態(tài)碼??
  • ????????.andDo(print());?//輸出MvcResult到控制臺(tái)??
  • ?

    測(cè)試普通控制器,但是URL錯(cuò)誤,即404

    Java代碼??
  • //找不到控制器,404測(cè)試??
  • MvcResult?result?=?mockMvc.perform(get("/user2/{id}",?1))?//執(zhí)行請(qǐng)求??
  • ????????.andDo(print())??
  • ????????.andExpect(status().isNotFound())?//驗(yàn)證控制器不存在??
  • ????????.andReturn();??
  • Assert.assertNull(result.getModelAndView());?//自定義斷言??
  • ?

    得到MvcResult自定義驗(yàn)證 ???

    Java代碼??
  • MvcResult?result?=?mockMvc.perform(get("/user/{id}",?1))//執(zhí)行請(qǐng)求??
  • ????????.andReturn();?//返回MvcResult??
  • Assert.assertNotNull(result.getModelAndView().getModel().get("user"));?//自定義斷言??
  • ?

    驗(yàn)證請(qǐng)求參數(shù)綁定到模型數(shù)據(jù)及Flash屬性?

    Java代碼??
  • mockMvc.perform(post("/user").param("name",?"zhang"))?//執(zhí)行傳遞參數(shù)的POST請(qǐng)求(也可以post("/user?name=zhang"))??
  • ????????.andExpect(handler().handlerType(UserController.class))?//驗(yàn)證執(zhí)行的控制器類型??
  • ????????.andExpect(handler().methodName("create"))?//驗(yàn)證執(zhí)行的控制器方法名??
  • ????????.andExpect(model().hasNoErrors())?//驗(yàn)證頁(yè)面沒有錯(cuò)誤??
  • ????????.andExpect(flash().attributeExists("success"))?//驗(yàn)證存在flash屬性??
  • ????????.andExpect(view().name("redirect:/user"));?//驗(yàn)證視圖??
  • ?

    驗(yàn)證請(qǐng)求參數(shù)驗(yàn)證失敗出錯(cuò)??

    Java代碼??
  • mockMvc.perform(post("/user").param("name",?"admin"))?//執(zhí)行請(qǐng)求??
  • ????????.andExpect(model().hasErrors())?//驗(yàn)證模型有錯(cuò)誤??
  • ????????.andExpect(model().attributeDoesNotExist("name"))?//驗(yàn)證存在錯(cuò)誤的屬性??
  • ????????.andExpect(view().name("showCreateForm"));?//驗(yàn)證視圖??
  • ?

    文件上傳?

    Java代碼??
  • //文件上傳??
  • byte[]?bytes?=?new?byte[]?{1,?2};??
  • mockMvc.perform(fileUpload("/user/{id}/icon",?1L).file("icon",?bytes))?//執(zhí)行文件上傳??
  • ????????.andExpect(model().attribute("icon",?bytes))?//驗(yàn)證屬性相等性??
  • ????????.andExpect(view().name("success"));?//驗(yàn)證視圖??
  • ?

    JSON請(qǐng)求/響應(yīng)驗(yàn)證

    測(cè)試時(shí)需要安裝jackson Json和JsonPath依賴:?

    Java代碼??
  • <dependency>??
  • ????<groupId>com.fasterxml.jackson.core</groupId>??
  • ????<artifactId>jackson-databind</artifactId>??
  • ????<version>${jackson2.version}</version>??
  • </dependency>??
  • ??
  • <dependency>??
  • ????<groupId>com.jayway.jsonpath</groupId>??
  • ????<artifactId>json-path</artifactId>??
  • ????<version>${jsonpath.version}</version>??
  • ????<scope>test</scope>??
  • </dependency>??
  • 版本:<jsonpath.version>0.9.0</jsonpath.version>、<jackson2.version>2.2.3</jackson2.version>? Java代碼??
  • String?requestBody?=?"{\"id\":1,?\"name\":\"zhang\"}";??
  • mockMvc.perform(post("/user")??
  • ????????????.contentType(MediaType.APPLICATION_JSON).content(requestBody)??
  • ????????????.accept(MediaType.APPLICATION_JSON))?//執(zhí)行請(qǐng)求??
  • ????????.andExpect(content().contentType(MediaType.APPLICATION_JSON))?//驗(yàn)證響應(yīng)contentType??
  • ????????.andExpect(jsonPath("$.id").value(1));?//使用Json?path驗(yàn)證JSON?請(qǐng)參考http://goessner.net/articles/JsonPath/??
  • ??
  • String?errorBody?=?"{id:1,?name:zhang}";??
  • MvcResult?result?=?mockMvc.perform(post("/user")??
  • ????????.contentType(MediaType.APPLICATION_JSON).content(errorBody)??
  • ????????.accept(MediaType.APPLICATION_JSON))?//執(zhí)行請(qǐng)求??
  • ????????.andExpect(status().isBadRequest())?//400錯(cuò)誤請(qǐng)求??
  • ????????.andReturn();??
  • ??
  • Assert.assertTrue(HttpMessageNotReadableException.class.isAssignableFrom(result.getResolvedException().getClass()));//錯(cuò)誤的請(qǐng)求內(nèi)容體??
  • ?

    XML請(qǐng)求/響應(yīng)驗(yàn)證

    測(cè)試時(shí)需要安裝spring oxm和xstream依賴:?

    Java代碼??
  • <dependency>??
  • ????<groupId>com.thoughtworks.xstream</groupId>??
  • ????<artifactId>xstream</artifactId>??
  • ????<version>${xsream.version}</version>??
  • ????<scope>test</scope>??
  • </dependency>??
  • ??
  • <dependency>??
  • ????<groupId>org.springframework</groupId>??
  • ????<artifactId>spring-oxm</artifactId>??
  • ????<version>${spring.version}</version>??
  • ????<scope>test</scope>??
  • </dependency>??
  • 版本:<xstream.version>1.4.4</xstream.version> Java代碼??
  • //XML請(qǐng)求/響應(yīng)??
  • String?requestBody?=?"<user><id>1</id><name>zhang</name></user>";??
  • mockMvc.perform(post("/user")??
  • ????????.contentType(MediaType.APPLICATION_XML).content(requestBody)??
  • ????????.accept(MediaType.APPLICATION_XML))?//執(zhí)行請(qǐng)求??
  • ????????.andDo(print())??
  • ????????.andExpect(content().contentType(MediaType.APPLICATION_XML))?//驗(yàn)證響應(yīng)contentType??
  • ????????.andExpect(xpath("/user/id/text()").string("1"));?//使用XPath表達(dá)式驗(yàn)證XML?請(qǐng)參考http://www.w3school.com.cn/xpath/??
  • ??
  • String?errorBody?=?"<user><id>1</id><name>zhang</name>";??
  • MvcResult?result?=?mockMvc.perform(post("/user")??
  • ????????.contentType(MediaType.APPLICATION_XML).content(errorBody)??
  • ????????.accept(MediaType.APPLICATION_XML))?//執(zhí)行請(qǐng)求??
  • ????????.andExpect(status().isBadRequest())?//400錯(cuò)誤請(qǐng)求??
  • ????????.andReturn();??
  • ??
  • Assert.assertTrue(HttpMessageNotReadableException.class.isAssignableFrom(result.getResolvedException().getClass()));//錯(cuò)誤的請(qǐng)求內(nèi)容體??
  • ?

    異常處理??

    Java代碼??
  • //異常處理??
  • MvcResult?result?=?mockMvc.perform(get("/user/exception"))?//執(zhí)行請(qǐng)求??
  • ????????.andExpect(status().isInternalServerError())?//驗(yàn)證服務(wù)器內(nèi)部錯(cuò)誤??
  • ????????.andReturn();??
  • ??
  • Assert.assertTrue(IllegalArgumentException.class.isAssignableFrom(result.getResolvedException().getClass()));??
  • ?

    靜態(tài)資源?

    Java代碼??
  • //靜態(tài)資源??
  • mockMvc.perform(get("/static/app.js"))?//執(zhí)行請(qǐng)求??
  • ????????.andExpect(status().isOk())?//驗(yàn)證狀態(tài)碼200??
  • ????????.andExpect(content().string(CoreMatchers.containsString("var")));//驗(yàn)證渲染后的視圖內(nèi)容包含var??
  • ??
  • mockMvc.perform(get("/static/app1.js"))?//執(zhí)行請(qǐng)求??
  • ????????.andExpect(status().isNotFound());??//驗(yàn)證狀態(tài)碼404??
  • 異步測(cè)試?

    Java代碼??
  • //Callable??
  • MvcResult?result?=?mockMvc.perform(get("/user/async1?id=1&name=zhang"))?//執(zhí)行請(qǐng)求??
  • ????????.andExpect(request().asyncStarted())??
  • ????????.andExpect(request().asyncResult(CoreMatchers.instanceOf(User.class)))?//默認(rèn)會(huì)等10秒超時(shí)??
  • ????????.andReturn();??
  • ??
  • mockMvc.perform(asyncDispatch(result))??
  • ????????.andExpect(status().isOk())??
  • ????????.andExpect(content().contentType(MediaType.APPLICATION_JSON))??
  • ????????.andExpect(jsonPath("$.id").value(1));??
  • Java代碼??
  • //DeferredResult??
  • result?=?mockMvc.perform(get("/user/async2?id=1&name=zhang"))?//執(zhí)行請(qǐng)求??
  • ????????.andExpect(request().asyncStarted())??
  • ????????.andExpect(request().asyncResult(CoreMatchers.instanceOf(User.class)))??//默認(rèn)會(huì)等10秒超時(shí)??
  • ????????.andReturn();??
  • ??
  • mockMvc.perform(asyncDispatch(result))??
  • ????????.andExpect(status().isOk())??
  • ????????.andExpect(content().contentType(MediaType.APPLICATION_JSON))??
  • ????????.andExpect(jsonPath("$.id").value(1));??
  • 此處請(qǐng)?jiān)诘谝淮握?qǐng)求時(shí)加上 andExpect(request().asyncResult(CoreMatchers.instanceOf(User.class)))這樣會(huì)等待結(jié)果返回/超時(shí),無須自己設(shè)置線程等待了;此處注意request().asyncResult一定是在第一次請(qǐng)求發(fā)出;然后第二次通過asyncDispatch進(jìn)行異步請(qǐng)求。

    ?

    添加自定義過濾器

    Java代碼??
  • mockMvc?=?webAppContextSetup(wac).addFilter(new?MyFilter(),?"/*").build();??
  • mockMvc.perform(get("/user/1"))??
  • ????????.andExpect(request().attribute("filter",?true));??
  • ?

    全局配置?

    Java代碼??
  • mockMvc?=?webAppContextSetup(wac)??
  • ????????.defaultRequest(get("/user/1").requestAttr("default",?true))?//默認(rèn)請(qǐng)求?如果其是Mergeable類型的,會(huì)自動(dòng)合并的哦mockMvc.perform中的RequestBuilder??
  • ????????.alwaysDo(print())??//默認(rèn)每次執(zhí)行請(qǐng)求后都做的動(dòng)作??
  • ????????.alwaysExpect(request().attribute("default",?true))?//默認(rèn)每次執(zhí)行后進(jìn)行驗(yàn)證的斷言??
  • ????????.build();??
  • ??
  • mockMvc.perform(get("/user/1"))??
  • ????????.andExpect(model().attributeExists("user")); ?
  • ?

    ?

    只要記住測(cè)試步驟,按照步驟操作,整個(gè)測(cè)試過程是非常容易理解的:

    1、準(zhǔn)備測(cè)試環(huán)境

    2、通過MockMvc執(zhí)行請(qǐng)求

    3.1、添加驗(yàn)證斷言

    3.2、添加結(jié)果處理器

    3.3、得到MvcResult進(jìn)行自定義斷言/進(jìn)行下一步的異步請(qǐng)求

    4、卸載測(cè)試環(huán)境

    總結(jié)

    以上是生活随笔為你收集整理的MockMVC的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    91九色精品女同系列 | 中文字幕在线观看三区 | 日韩69视频| 久久久官网 | 色香蕉在线视频 | 免费观看一级一片 | 国产一区二区三精品久久久无广告 | 黄色www在线观看 | 国产成人一区二区在线观看 | 日韩欧美在线视频一区二区 | 国产精品99久久久精品 | 狠狠狠狠干 | 午夜av一区 | 精品天堂av | 人人澡人摸人人添学生av | 欧美日韩免费在线观看视频 | 国产精品美女久久久久久久网站 | 精品国产123| 免费观看91视频大全 | 我爱av激情网 | 99精品系列 | 91精品在线视频观看 | 日韩三级中文字幕 | 亚洲精品美女在线观看播放 | 久久久久久久久影视 | 国产69久久精品成人看 | 久久久99国产精品免费 | 一级黄色免费 | 日本三级国产 | 日本中文字幕一二区观 | 狠狠精品| 国产精品嫩草影视久久久 | 国产成人在线观看免费 | 国产精品入口a级 | 在线看国产一区 | 91大神精品视频在线观看 | 国产精品久久综合 | 国产欧美精品xxxx另类 | 国产网站在线免费观看 | 丁香六月婷婷激情 | 9992tv成人免费看片 | 免费av大全 | av五月婷婷 | 午夜精品久久一牛影视 | 久久激情电影 | 在线观看日本高清mv视频 | 国产美女视频 | 狠狠综合久久av | 欧美日韩精品在线一区二区 | 亚洲最大在线视频 | 啪嗒啪嗒免费观看完整版 | 久久蜜臀av| 天天操,夜夜操 | 97电影网手机版 | 五月婷婷视频在线 | 国产福利久久 | 精品国产伦一区二区三区观看说明 | 97人人澡人人爽人人模亚洲 | 久久蜜臀一区二区三区av | 丝袜美腿一区 | 成人一级片视频 | 美女精品国产 | 婷婷伊人五月 | 国产99久久久国产精品 | 国产免费不卡av | 丁香五月亚洲综合在线 | 四虎成人精品永久免费av | 一本到在线 | 又长又大又黑又粗欧美 | 欧美91在线 | 久久久精品国产一区二区三区 | 亚洲五月 | 亚洲国产资源 | 久久在线免费视频 | 日本精品久久久一区二区三区 | 四虎视频 | 国产精品毛片一区二区 | 久久久久国产一区二区三区四区 | www亚洲精品 | 免费看色网站 | 国产丝袜一区二区三区 | 国产综合香蕉五月婷在线 | 国产亚洲精品综合一区91 | 色综合久久久久 | 久久激情综合网 | 99色资源 | 91黄色免费看 | 久久婷婷亚洲 | 婷婷中文字幕 | 国产小视频你懂的 | 精品字幕 | 久久精品国产第一区二区三区 | 91在线91| 在线播放国产精品 | 成人一级视频在线观看 | 911香蕉视频 | 国产精品入口麻豆 | 97精品一区| 亚洲狠狠操 | 九九热在线视频免费观看 | 久久久久国产精品视频 | a v在线视频 | www黄色com | 婷婷丁香五| 韩国一区二区三区在线观看 | 91在线看网站 | 丁香国产视频 | 99久热在线精品视频观看 | 成人黄色大片 | 99成人精品 | 一区二区三区在线电影 | 91九色国产在线 | 欧美成年性 | 少妇性xxx | 国偷自产中文字幕亚洲手机在线 | 美女视频黄在线观看 | av播放在线 | 97国产大学生情侣酒店的特点 | 亚洲精品色视频 | 亚洲久草网 | 中文字幕在线观看一区 | 日本中文在线 | 中文在线天堂资源 | 欧美色图亚洲图片 | 亚洲爱视频 | 亚洲资源在线 | 欧美日韩网站 | 99精品国产99久久久久久福利 | 三上悠亚在线免费 | 国产一级在线视频 | 日韩电影久久久 | 日韩精品视频在线免费观看 | 亚洲在线资源 | 激情综合五月天 | 日韩动态视频 | 99这里只有久久精品视频 | 久久伊人婷婷 | 久久69av| 日本精品一区二区 | av视屏在线 | 在线免费观看黄色大片 | 伊人久操 | 麻豆一精品传二传媒短视频 | 国产精品av久久久久久无 | 6080yy精品一区二区三区 | 亚洲国产小视频在线观看 | 丝袜足交在线 | 国产香蕉av | 久久久久欠精品国产毛片国产毛生 | 人人爱人人做人人爽 | 91在线视频免费观看 | 国产麻豆视频在线观看 | 国产精品成人在线观看 | 精品亚洲成a人在线观看 | 国产91综合一区在线观看 | 久久久久久亚洲精品 | 欧美一级看片 | 欧美日韩国产三级 | 婷婷久久一区二区三区 | 国产精品乱码一区二三区 | 国产在线观看高清视频 | 精品一区二区免费视频 | 精品九九九| 国内精品久久久久久久 | 在线亚洲成人 | 91热这里只有精品 | 久久精品最新 | 免费在线观看a v | 日本黄色大片免费看 | 麻花豆传媒mv在线观看网站 | 丰满少妇在线观看网站 | 美女黄久久 | 97综合在线 | 黄色a在线观看 | 五月天久久综合 | 狠狠色噜噜狠狠狠狠 | 激情五月激情综合网 | 麻豆传媒在线免费看 | 精品国产精品国产偷麻豆 | 日韩高清在线观看 | 国产一级久久 | 国产精品成人aaaaa网站 | 国产精品www | 日韩视频三区 | 在线免费观看视频 | 亚洲成人黄色在线观看 | 欧美日韩精品在线观看视频 | 久久视讯| 99产精品成人啪免费网站 | 亚洲国产精品第一区二区 | 成人av手机在线 | 国产这里只有精品 | 国产精品久久久久久久久久免费 | 一区中文字幕在线观看 | 亚洲精品456在线播放乱码 | 日韩欧美一区二区三区在线观看 | 欧美日本国产在线观看 | 制服丝袜亚洲 | 精品国产123 | wwwww.国产 | 99热这里只有精品8 久久综合毛片 | 黄色亚洲免费 | 久久天天躁夜夜躁狠狠85麻豆 | 国产精品久久久久三级 | 久久超碰免费 | 91色在线观看视频 | 亚洲国产精品激情在线观看 | 国产一级视屏 | av一级片 | 日日摸日日碰 | 日日爽视频 | 天天艹 | 国产精品一区欧美 | 免费色网 | 成人国产精品免费 | av成人亚洲 | 国产午夜精品视频 | 欧美日韩国产综合网 | 91麻豆精品国产自产 | 日韩欧美xxxx | 九九免费在线观看视频 | 天天综合入口 | 人人舔人人干 | 免费高清无人区完整版 | 国产精品视频永久免费播放 | 国产成人久久av977小说 | 精品国模一区二区三区 | 久久久久日本精品一区二区三区 | 久久影视精品 | 精品一二三四在线 | 91亚洲精品乱码久久久久久蜜桃 | 三级动态视频在线观看 | 岛国av在线不卡 | 国产在线观看不卡 | 久久香蕉国产精品麻豆粉嫩av | 91日韩精品视频 | 天天色天天操综合 | 久久社区视频 | av超碰在线观看 | 免费看片亚洲 | 激情综合网五月激情 | 狠狠色狠狠色综合日日小说 | 97超碰免费在线 | 成人黄色小说在线观看 | 国产不卡高清 | 玖玖视频国产 | 久久国产网站 | 六月婷操 | 九九爱免费视频 | 欧美日韩高清一区二区 国产亚洲免费看 | 99 久久久久 | 日韩两性视频 | 国内丰满少妇猛烈精品播 | 婷婷激情在线观看 | 中文字幕亚洲精品在线观看 | 蜜桃视频在线观看一区 | 久久不见久久见免费影院 | 日本高清中文字幕有码在线 | 中文字幕精品一区久久久久 | 成人免费视频免费观看 | 麻豆91在线 | 色夜视频 | 亚洲精品五月天 | 国产一区二区三区免费在线观看 | 免费午夜在线视频 | 波多野结衣在线视频免费观看 | 国产精品你懂的在线观看 | www天天干com| 综合色在线观看 | www.av中文字幕.com | 在线观看免费av网 | 美女视频永久黄网站免费观看国产 | 色偷偷男人的天堂av | 中文字幕在线播放视频 | 亚洲aⅴ一区二区三区 | 久久特级毛片 | 高清免费在线视频 | 精品视频久久 | 精品久久一区二区三区 | free. 性欧美.com | 国产精品1区2区 | 天天干天天色2020 | 欧美日韩二三区 | 黄色小说视频在线 | 国语自产偷拍精品视频偷 | 日日骑| 日日躁你夜夜躁你av蜜 | 超碰免费在线公开 | 天天干,天天射,天天操,天天摸 | 一本—道久久a久久精品蜜桃 | 在线观看精品黄av片免费 | 亚洲综合色激情五月 | 久久大视频 | 亚洲人成人天堂h久久 | 日韩在线小视频 | 91视频麻豆视频 | 亚洲精品视频偷拍 | 久久免费视频这里只有精品 | 区一区二区三区中文字幕 | 黄色网址中文字幕 | 国产精品一区二区三区在线免费观看 | 激情婷婷六月 | 欧美天堂影院 | 中文字幕一区在线 | 人人狠狠综合久久亚洲婷 | 黄色精品免费 | 伊人色综合久久天天 | 97电影在线 | 深夜免费福利在线 | 97在线视 | 日韩精品免费在线观看视频 | 中文字幕日韩一区二区三区不卡 | 婷婷播播网 | 国产亚洲精品成人 | 日韩专区一区二区 | 伊人五月天 | 日韩欧美国产激情在线播放 | 在线观看一区二区视频 | 激情久久伊人 | 91激情视频在线播放 | 97精品一区 | 最新av网址在线 | 国产成人精品一区二区三区福利 | 国产黑丝一区二区 | 五月天狠狠操 | 日日操网 | av免费在线免费观看 | 久久看免费视频 | 天天综合网入口 | 久久女同性恋中文字幕 | 久久久久久久久久毛片 | 中文字幕日本电影 | 91精品秘密在线观看 | 日本三级在线观看中文字 | 日韩激情免费视频 | 国产亚洲精品久久久网站好莱 | 国产精品久久久久久久久久久不卡 | 手机成人av | 国产色在线,com | 毛片a级片 | 国内视频 | 日本黄色免费大片 | www日韩精品| 亚洲欧洲精品久久 | 亚洲视频 在线观看 | 亚洲精品国产品国语在线 | 日韩va在线观看 | 日韩久久久久久久久久久久 | 国产91学生粉嫩喷水 | 国产高清不卡一区二区三区 | 久久精品视频播放 | 国产精品九色 | 国产福利精品一区二区 | 激情av一区二区 | www.xxxx欧美| 久草香蕉在线视频 | 欧美精品xxx | 国产精品男女 | 亚洲国产精品一区二区尤物区 | 在线亚洲欧美日韩 | 天天综合导航 | 国产一区二区免费在线观看 | 人人干狠狠干 | 欧美亚洲成人免费 | 97日日 | 成人三级av | 国产精品区一区 | 99久久久久国产精品免费 | 国产精品一区二区62 | 成年人免费观看在线视频 | 超碰在97| 婷婷综合成人 | 人人澡人人模 | 国产高清精| 国产成人av免费在线观看 | 久久久久免费精品国产 | 久久国产精品99久久人人澡 | 狠狠色伊人亚洲综合网站野外 | 久久精品一区 | 久久精品国产免费看久久精品 | 97人人人人 | 超碰人人做| 亚洲一区日韩在线 | 久久婷亚洲五月一区天天躁 | 久久这里只有精品久久 | 免费在线激情电影 | 最新av网址在线观看 | 国产又黄又爽又猛视频日本 | 亚洲日b视频 | 探花视频免费在线观看 | 久久亚洲综合国产精品99麻豆的功能介绍 | 久久免费视频4 | 91女子私密保健养生少妇 | 久久综合给合久久狠狠色 | 久草在线观看资源 | 久久久 精品 | 亚洲精品午夜久久久久久久久久久 | 国产精品一区二区久久精品爱微奶 | 午夜av网站 | 91视频在线观看大全 | 欧美日韩亚洲在线观看 | 久久99精品国产91久久来源 | 久草网在线 | 99色| 韩国一区二区三区在线观看 | 亚洲乱码在线 | 久久亚洲婷婷 | 黄色三级网站在线观看 | 日韩免费一级a毛片在线播放一级 | 热久在线 | 九九热在线视频 | 日韩欧美视频免费看 | 欧美日韩午夜爽爽 | 久久久久久久久久久久国产精品 | 中文字幕91在线 | 日韩av高清在线观看 | 亚洲精品免费在线观看视频 | 精品国产不卡 | 91精品视频免费在线观看 | 久久99精品国产99久久 | 久久国产精品99久久久久 | 在线直播av | 男女全黄一级一级高潮免费看 | 草莓视频在线观看免费观看 | 永久免费的啪啪网站免费观看浪潮 | 在线看av的网址 | 成年人三级网站 | 国产九九热 | 婷婷亚洲激情 | 日韩欧美中文 | av免费观看网址 | 69久久99精品久久久久婷婷 | 天天操天天操天天 | 日韩欧美xxx | 亚洲精品大全 | 免费看污污视频的网站 | 欧美一区三区四区 | 在线播放日韩av | 国产在线a视频 | 日韩久久久久久久久久久久 | 日韩在线免费播放 | 国产伦理一区二区 | 国产精品美女久久久免费 | 综合精品久久久 | 亚洲精品美女 | 免费91在线 | 干干干操操操 | 欧美日韩免费观看一区=区三区 | 四虎国产精品永久在线国在线 | 国产亚洲日 | 国产精品资源在线 | 国产亚洲精品美女久久 | 久久夜色精品国产欧美一区麻豆 | 超碰在线cao | 天天骚夜夜操 | 激情片av | 国产91丝袜在线播放动漫 | 欧美久久久 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 天天插视频 | 国产高清成人 | 久久人人爽爽 | 人人插人人草 | 97视频在线免费观看 | 福利视频一二区 | 永久av免费在线观看 | 日日干综合 | 青草视频免费观看 | 中文字幕免费久久 | 99爱在线观看 | www,黄视频 | 在线观看黄网 | 精品国产乱码久久久久久1区2匹 | 亚洲成人免费在线 | 国产精品入口传媒 | 麻花天美星空视频 | 日韩视频区 | 亚洲成人资源在线观看 | 国产精品自拍av | 999久久精品 | 久久精品综合视频 | 国产精品高清免费在线观看 | 激情婷婷 | 美女精品在线观看 | 久久夜色网 | 欧美成人中文字幕 | 成人免费观看网址 | 国产欧美久久久精品影院 | 99re热精品视频| 超碰国产97| 色天天综合久久久久综合片 | 久久精品国亚洲 | 色播六月天 | 欧美一级片在线观看视频 | 天天插夜夜操 | 97精品国产一二三产区 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 99热最新 | 在线成人免费电影 | 亚洲精品国产精品99久久 | 午夜精品久久久久久久99 | 狠狠躁日日躁狂躁夜夜躁 | 视频三区 | 国产午夜小视频 | 久久久九九 | 久久综合影视 | 狠狠躁夜夜a产精品视频 | wwwwwww黄 | 在线亚洲成人 | 在线播放国产一区二区三区 | 国产 欧美 日韩 | 日韩视频在线不卡 | 日韩专区在线 | 射射射av | 日韩精品三区四区 | 精品视频免费播放 | 亚洲精品乱码久久久久 | 在线va网站 | www成人av| 亚洲高清精品在线 | 亚洲精品久久久久久久不卡四虎 | 中文字幕在线观看91 | 中文字幕乱码亚洲精品一区 | 亚洲精品在线观看av | 日韩毛片在线一区二区毛片 | 中文一区在线 | 在线影院 国内精品 | 国产91亚洲 | 免费十分钟 | 天天草天天干天天 | 麻豆传媒电影在线观看 | 久久精品99久久久久久 | 日韩精品一区二区三区在线播放 | 99草在线视频 | 国产精品久久婷婷六月丁香 | 粉嫩av一区二区三区四区 | 成年人毛片在线观看 | 久久久在线 | 丁香资源影视免费观看 | 97视频在线免费观看 | 中文字幕免费高清 | 久久免费视频8 | 涩涩资源网 | 九九在线播放 | 麻豆传媒视频在线免费观看 | 天天躁日日 | 碰超在线97人人 | 一本一本久久a久久 | 有码中文字幕在线观看 | 天天天天爱天天躁 | 99久久久久国产精品免费 | 国产精品99久久久久久有的能看 | 久久影视一区 | 青青河边草免费直播 | 伊人视频 | 永久免费的啪啪网站免费观看浪潮 | 97超碰伊人| 久久久官网 | 狠狠色丁香婷婷综合久小说久 | 午夜视频在线观看网站 | 国产资源av| 夜夜躁狠狠躁日日躁 | 亚洲aaa级| 国产高清视频 | 青青河边草免费观看完整版高清 | 国产一区在线视频观看 | 久久久久久久久久久国产精品 | 国产亚洲va综合人人澡精品 | 久久久久亚洲国产精品 | 三级黄免费看 | 欧美有色 | 午夜在线观看 | 99久久婷婷国产 | 国产精品91一区 | 天堂中文在线播放 | 久久久久看片 | 国产精品久久久一区二区三区网站 | 国产精品6999成人免费视频 | av永久网址 | 中文网丁香综合网 | 久99久精品视频免费观看 | 日日干天天射 | 国产一线二线三线性视频 | av黄色一级片 | 午夜精品电影 | 中字幕视频在线永久在线观看免费 | 黄色毛片观看 | av一区二区三区在线播放 | 日韩精品短视频 | 欧美综合色 | 亚洲闷骚少妇在线观看网站 | 国产精品久久久久久久久久三级 | 激情丁香久久 | 久久精品国产99国产 | 国产精品不卡在线 | 久久久久久久久久久久久久av | 日本女人的性生活视频 | 97人人人 | 久久天天操| 99精品国产免费久久久久久下载 | 亚洲精品97 | 亚州国产精品 | 91观看视频 | 五月天中文字幕mv在线 | 国产精品2区 | 粉嫩av一区二区三区四区在线观看 | 超碰97在线看 | 婷婷丁香花 | 午夜影院先 | 天天久久夜夜 | 久久艹中文字幕 | 97夜夜澡人人双人人人喊 | 欧美aa级| 三级黄色在线 | 97国产超碰| 国产精品日韩精品 | 青青草视频精品 | 日韩美视频 | 亚洲少妇xxxx| 黄色特一级片 | 欧美电影黄色 | 国产超碰97| 国产美女网 | 欧美日韩国产一区二区三区 | 天堂av网址 | 国产成人精品在线播放 | 日韩美女黄色片 | 国产99久久久精品 | 亚洲成人精品在线观看 | 久久99精品久久久久久久久久久久 | 91精品对白一区国产伦 | 制服丝袜天堂 | 免费人成在线观看网站 | 不卡av电影在线观看 | 狠狠狠狠狠狠狠狠 | 爱情影院aqdy鲁丝片二区 | 韩日电影在线免费看 | 久久香蕉国产精品麻豆粉嫩av | 日本精品中文字幕在线观看 | 欧美激情精品久久久久久免费印度 | 草久热 | 亚洲欧美日韩精品久久久 | 精品久久久久久久久久久久 | 日韩精品高清不卡 | 国产高清视频免费观看 | 超碰人人做| 五月婷婷综 | 久草免费看 | h网站免费在线观看 | 久久九九久久精品 | 在线观看黄网站 | 成片免费观看视频大全 | 免费观看黄 | 久久久精品 | 久久情侣偷拍 | 亚洲欧美国产日韩在线观看 | 精品美女久久久久久免费 | 五月天九九 | 日韩乱色精品一区二区 | 亚洲综合一区二区精品导航 | 高清日韩一区二区 | 免费欧美精品 | 午夜a区 | 黄色一二级片 | 亚洲电影第一页av | 国内精品二区 | 香蕉视频18 | 韩国一区视频 | 国产一区二区网址 | 天堂av免费 | 国内视频在线观看 | 亚洲国产日韩欧美在线 | 天天干天天色2020 | 97av.com| 丰满少妇在线观看资源站 | 久久久久一区二区三区 | 欧美精品一区二区蜜臀亚洲 | 亚洲黄色av网址 | 国产亚洲激情视频在线 | 色天堂在线视频 | 丁香激情综合久久伊人久久 | 狠狠色丁香久久婷婷综合五月 | 久久久久久久福利 | 色婷婷丁香 | 国产在线精品福利 | 人人干人人搞 | av免费网站观看 | 国产精品久久久久久久久大全 | av在线免费在线观看 | 久久久精品一区二区 | 色久综合 | 精品日韩在线一区 | 色吧av色av | 91av网址| 黄色成人在线观看 | 久草免费在线观看视频 | 天天干天天干天天干 | 日韩v欧美v日本v亚洲v国产v | 99这里只有精品视频 | 成人一区二区三区在线 | 欧美日韩国产二区 | 国产毛片在线 | 久久成人国产精品入口 | 欧美在线aa | 日韩精品不卡在线观看 | av综合 日韩 | 91在线小视频 | 日韩有码中文字幕在线 | 国产三级午夜理伦三级 | 欧美性猛片, | 欧美少妇xxx | 亚洲精品女 | 韩日成人av | 国产日韩欧美在线观看 | 国产精品毛片一区视频播不卡 | 久久久精品一区二区 | 91欧美精品| 国产高清在线一区 | av网址aaa| 国产九九九九九 | 亚洲精品xxx| 一区二区理论片 | 91精品区 | 精品国产精品久久 | 高潮久久久久久 | 一区二区视频在线免费观看 | 国产永久网站 | 国产一区二区三区免费观看视频 | 激情av综合 | 亚洲精品视频免费在线观看 | 91精品影视| 奇米网在线观看 | 国产成人亚洲在线观看 | 99精品系列 | 国产剧情一区二区在线观看 | 美女黄久久 | 久久综合九色 | 久久精品国产成人 | 国产亚洲婷婷免费 | 99r国产精品 | 在线观看av的网站 | 少妇av网 | 91av视频免费观看 | 99精品欧美一区二区三区黑人哦 | 久久国产精品小视频 | 亚洲精品一区二区在线观看 | 日韩在线观看第一页 | www.五月天激情 | 国产在线免费观看 | 天天干天天玩天天操 | 三级av黄色 | 亚洲视频资源在线 | 精品亚洲成人 | 免费看毛片网站 | a久久免费视频 | 成人国产网址 | 日韩成人精品一区二区三区 | 主播av在线 | 日本中出在线观看 | av千婊在线免费观看 | 亚洲一区二区黄色 | 国产精品剧情在线亚洲 | 日韩av中文| 在线观影网站 | 亚洲精品激情 | 欧美伦理一区二区 | 日韩在线中文字幕 | 热久久99这里有精品 | 天天插天天操天天干 | 亚洲最大色| 91桃色在线观看视频 | 久久久久五月 | 九九天堂 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 久久九九久久精品 | 四虎在线免费观看 | 欧美激情精品久久久久久变态 | 日韩电影中文字幕在线观看 | 日日干天天干 | 在线观看视频色 | 免费观看成年人视频 | 91超碰在线播放 | 亚洲综合小说 | 欧美日韩国产精品一区二区三区 | 欧美一级久久 | 激情在线五月天 | av一级一片 | 久久视频热 | 黄色小网站免费看 | 婷婷福利影院 | 久久久精品国产免费观看同学 | 欧美另类性 | 国产录像在线观看 | 精品国内自产拍在线观看视频 | 国内精品久久久久久久影视麻豆 | 久久久午夜电影 | 国产精品成人自拍 | www色网站| 99精品在线免费视频 | 久久美女高清视频 | 在线观看中文字幕dvd播放 | 亚洲黄色小说网 | 国产黄色大片免费看 | 国产精品久久久久久久99 | 99热官网 | 国产精品永久在线观看 | 精品91在线 | 日韩三级不卡 | 波多野结衣久久资源 | 丝袜网站在线观看 | 久久视频中文字幕 | 岛国大片免费视频 | 一区二区中文字幕在线 | 色网站在线免费观看 | 欧美精品v国产精品 | 在线观看日本高清mv视频 | 天天操天天射天天舔 | 青青草国产精品 | 在线观看深夜视频 | 在线看av的网址 | 伊人天堂av | 米奇影视7777 | 九色自拍视频 | 九七人人干 | 在线观看亚洲成人 | 国产精品专区在线观看 | 欧美成年人在线视频 | 久久在线免费观看视频 | 国产成人精品一区二区在线观看 | 久久理伦片| 日韩 精品 一区 国产 麻豆 | 天天色综合天天 | 国产伦理久久精品久久久久_ | 激情大尺度视频 | 欧美一级乱黄 | 国产精品18久久久久久久网站 | 91精品网站在线观看 | 天天爽天天做 | 色婷婷福利 | 五月激情姐姐 | 综合精品久久久 | 国产无吗一区二区三区在线欢 | 国产日韩精品欧美 | 成片免费观看视频 | 国产h在线观看 | 精品视频123区在线观看 | 国产成人精品久久二区二区 | 在线看片视频 | 日韩免费三区 | 免费在线a | 尤物97国产精品久久精品国产 | 狠狠地操 | 国产女人40精品一区毛片视频 | 久久精品99久久久久久 | 狠狠干2018 | 久久免费视频播放 | 天天干一干 | 中文字幕在线不卡国产视频 | 欧女人精69xxxxxx | 国产91免费看| 婷婷激情综合 | 97碰在线视频 | 国产成人一二三 | 亚洲精品乱码久久久久久蜜桃欧美 | 成人在线网站观看 | 久久久久99精品国产片 | 久久久久久久久影视 | 在线小视频国产 | 国产一区二区视频在线播放 | 国产精品永久久久久久久久久 | 91视频-88av| 成年人免费在线观看网站 | 中文字幕在线免费播放 | 在线观看一级视频 | 国产伦理久久精品久久久久_ | 91成人精品视频 | 欧美大片第1页 | 天天干天天射天天插 | 2019av在线视频 | 最新极品jizzhd欧美 | 久久免费视频8 | 久久久久一区二区三区四区 | 91av社区 | 91chinese在线 | av网站在线免费观看 | 一级特黄aaa大片在线观看 | 亚洲三级av| 中文字幕日韩电影 | 一本大道久久精品懂色aⅴ 五月婷社区 | 久久精品久久99 | 中文字幕国产精品 | 国产美女久久久 | 免费久久99精品国产 | 日本久久精品 | 91亚洲激情 | 黄色在线观看网站 | 五月丁色 | 久久最新 | 免费精品视频在线观看 | 91成人免费看 | 中文字幕一区二区三区在线播放 | 日韩精品播放 | 日日爱999 | 97中文字幕| 欧洲一区二区在线观看 | 久久99精品久久久久蜜臀 | 日韩理论片 | 亚洲综合视频在线 | 久久国产精品99精国产 | 国产黄色成人 | 人人添人人澡人人澡人人人爽 | 亚洲第一久久久 | 免费看色的网站 | 91精品国产综合久久福利 | 久久婷婷影视 | av黄色在线观看 | 国产成人久久av免费高清密臂 | 久久调教视频 | www178ccom视频在线 | 91视频这里只有精品 | 国产日韩精品一区二区 | 久草在线视频首页 | 国产69精品久久久久久久久久 | 深夜免费小视频 | 中文字幕日韩电影 | 伊人网av| 久久情网| 亚洲一区日韩在线 | 日本性xxx | 黄色一级免费网站 | a天堂免费 | 97在线视频观看 | 日韩一区二区三 | 国产v在线观看 | 91精品一区二区三区蜜桃 | 日韩成人xxxx | 91九色视频在线 | 欧美日韩1区2区 | 欧美一级乱黄 | www色av| 日日干狠狠操 | 亚洲免费国产视频 | 91超级碰| 久草在线观看资源 | 免费av看片 | 少妇资源站| 国产在线视频一区二区三区 | 欧美日韩国产xxx | 亚洲精品日韩av | 婷婷六月综合亚洲 | 国产亚州精品视频 | 亚洲在线网址 | 91精品视屏 | 爱情影院aqdy鲁丝片二区 | 麻豆极品 | www天天干com| 国产精品视频永久免费播放 | 99精品视频在线观看视频 | 夜夜澡人模人人添人人看 | 国产成人免费观看久久久 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 丁香视频全集免费观看 | 国产韩国日本高清视频 | 天天操狠狠操 | 亚洲免费公开视频 | 国产专区日韩专区 | 久久视频免费 | 91福利视频久久久久 | 日韩在线字幕 | 国产 视频 高清 免费 | 国产精品国产三级国产aⅴ9色 | 三上悠亚在线免费 | 中文字幕在线高清 | 久草免费色站 | 99r在线 | 国产99免费 | 国产精品99久久久久久久久久久久 | 黄色小网站免费看 | 最新国产精品亚洲 | 亚洲国产成人精品电影在线观看 | 三级视频日韩 | 欧美少妇bbwhd | 高清视频一区二区三区 | 亚洲免费av在线播放 | 成人av影视在线 | 在线成人免费av | 成人中文字幕+乱码+中文字幕 | 激情综合啪啪 | 日韩av一区二区在线 | 久久艹艹 | 亚洲一区二区三区在线看 | 亚洲欧美日韩在线看 | 狠狠网 | 国产福利精品视频 | 久久久久久久久久网 | 欧美日韩亚洲精品在线 | 精品中文字幕视频 | 日韩久久精品一区二区三区下载 |