Java-Junit单元测试

单元测试的目的

  简单来说就是在我们增加或者改动一些代码以后对所有逻辑的一个检测,尤其是在我们后期修改后(不论是增加新功能,修改bug),都可以做到重新测试的工作。以减少我们在发布的时候出现更过甚至是出现之前解决了的问题再次重现。

Junit测试Controller(MockMVC使用)

spring mvc测试框架提供了两种方式,独立安装和集成Web环境测试(此种方式并不会集成真正的web环境,而是通过相应的Mock API进行模拟测试,无须启动服务器)
MockMvcBuilder是用来构造MockMvc的构造器,其主要有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder,StandaloneMockMvcBuilder继承了DefaultMockMvcBuilder。直接使用静态工厂MockMvcBuilders创建即可:

  • MockMvcBuilders.webAppContextSetup(WebApplicationContext context):指定WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的MockMvc;
  • MockMvcBuilders.standaloneSetup(Object... controllers):通过参数指定一组控制器,这样就不需要从上下文获取了;

DefaultMockMvcBuilder提供API:

  • addFilters(Filter... filters)/addFilter(Filter filter, String... urlPatterns):添加javax.servlet.Filter过滤器
  • defaultRequest(RequestBuilder requestBuilder):默认的RequestBuilder,每次执行时会合并到自定义的RequestBuilder中,即提供公共请求数据的;
  • alwaysExpect(ResultMatcher resultMatcher):定义全局的结果验证器,即每次执行请求时都进行验证的规则;
  • alwaysDo(ResultHandler resultHandler):定义全局结果处理器,即每次请求时都进行结果处理;
  • dispatchOptions:DispatcherServlet是否分发OPTIONS请求方法到控制器;

StandaloneMockMvcBuilder继承了DefaultMockMvcBuilder,提供如下API:

  • setMessageConverters(HttpMessageConverter<?>...messageConverters):设置HTTP消息转换器;
  • setConversionService(FormattingConversionService conversionService):设置转换服务;
  • setValidator(Validator validator):设置验证器;
  • addInterceptors(HandlerInterceptor... interceptors)/addMappedInterceptors(String[] pathPatterns, HandlerInterceptor... interceptors):添加spring mvc拦截器;
  • setContentNegotiationManager(ContentNegotiationManager contentNegotiationManager):设置内容协商管理器;
  • setAsyncRequestTimeout(long timeout):设置异步超时时间;
  • setCustomArgumentResolvers(HandlerMethodArgumentResolver... argumentResolvers):设置自定义控制器方法参数解析器;
  • setCustomReturnValueHandlers(HandlerMethodReturnValueHandler... handlers):设置自定义控制器方法返回值处理器;
  • setHandlerExceptionResolvers(List exceptionResolvers)/setHandlerExceptionResolvers(HandlerExceptionResolver... exceptionResolvers):设置异常解析器;
  • setViewResolvers(ViewResolver...resolvers):设置视图解析器;
  • setSingleView(View view):设置单个视图,即视图解析时总是解析到这一个(仅适用于只有一个视图的情况);
  • setLocaleResolver(LocaleResolver localeResolver):设置Local解析器;
  • setFlashMapManager(FlashMapManager flashMapManager):设置FlashMapManager,如存储重定向数据;
  • setUseSuffixPatternMatch(boolean useSuffixPatternMatch):设置是否是后缀模式匹配,如“/user”是否匹配"/user.*",默认真即匹配;
  • setUseTrailingSlashPatternMatch(boolean useTrailingSlashPatternMatch):设置是否自动后缀路径模式匹配,如“/user”是否匹配“/user/”,默认真即匹配;
  • addPlaceHolderValue(String name, String value) :添加request mapping中的占位符替代;

因为StandaloneMockMvcBuilder不会加载Spring MVC配置文件,因此就不会注册我们需要的一些组件,因此就提供了如上API用于注册我们需要的相应组件。

1、mockMvc.perform 执行一个RequestBuilder请求,会自动执行SpringMVC的流程并映射到相应的控制器执行处理
2、MockMvcRequestBuilders.get("/user/1") 构造一个请求
3、ResultActions.andExpect 添加执行完成后的断言,添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确
4、ResultActions.andDo 添加一个ResultHandler结果处理器,表示要对结果做点什么事情,比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。
5、ResultActions.andReturn 表示执行完成后返回相应的MvcResult结果,然后进行自定义验证/进行下一步的异步处理

MockMvcRequestBuilders主要API:

  • MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables):根据uri模板和uri变量值得到一个GET请求方式的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方法;

ResultActions

调用MockMvc.perform(RequestBuilder requestBuilder)后将得到ResultActions,通过ResultActions完成如下三件事:

  • ResultActions andExpect(ResultMatcher matcher) :添加验证断言来判断执行请求后的结果是否是预期的;
  • ResultActions andDo(ResultHandler handler) :添加结果处理器,用于对验证成功后执行的动作,如输出下请求/结果信息用于调试;
  • MvcResult andReturn() :返回验证成功后的MvcResult;用于自定义验证/下一步的异步处理;(主要是拿到结果进一步做自定义断言)

环境

@Before:准备环境,在测试用例之前执行,比如安装mock依赖,比如新建被测系统
@After:清理环境,在测试用例之后执行,比如数据库回滚,删除数据,关闭文件
@BeforeClass:测试用例类之前执行
@AfterClass:测试用例类之后执行

@Autowired
    private MappingJackson2HttpMessageConverter jacksonMessageConverter;

    @Autowired
    private FormattingConversionService formattingConversionService;

    private MockMvc restTesrMockMvc;


    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        final TestController testController = new TestController();
        restTesrMockMvc= MockMvcBuilders.standaloneSetup(testController )
                .setConversionService(formattingConversionService)
                .setMessageConverters(jacksonMessageConverter).build();
    }

    @Before
    public void initTest() {

    }

    @Test
    public void list() throws Exception {
        restTesrMockMvc.perform(get("/api/test/list")
                .param("param1", "1")
                .contentType(MediaType.APPLICATION_FORM_URLENCODED))
                .andExpect(status().isOk());
    }

当传入参数是被@ResponseBody标识的参数

contentType需要设置成MediaType.APPLICATION_JSON,即声明是发送“application/json”格式的数据。使用content方法,将转换的json数据放到request的body中。

 @Test
    public void list() throws Exception {
        MvcResult result = restBodyPlatMockMvc.perform(get("/api/bodyplat/list")
                .param("param1", "1")
                .contentType(MediaType.APPLICATION_JSON)) //接收类型
                .andExpect(status().isOk())
                .andDo(MockMvcResultHandlers.print()) //打印内容
                .andExpect(MockMvcResultMatchers.content().string(Matchers.containsString("OK")))//匹配返回值中的内容
                .andExpect((ResultMatcher)MockMvcResultMatchers.jsonPath("$.errcode",MockMvcResultMatchers.status().is(200)))//使用jsonPath解析返回值,判断具体内容
                .andReturn();
        Assert.assertEquals(result.getResponse().getStatus(),200);
    }
所有博客均为自己学习的笔记。如有错误敬请理解。
原文地址:https://www.cnblogs.com/tangtang-benben/p/15498205.html