Junit测试 - mockMVC

作者: Tim在路上 | 来源:发表于2019-01-17 20:37 被阅读4次

使用mock工具可以直接模拟http请求,不用直接产生网络的请求环境,简化了测试流程。

MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。

Spring MVC的测试往往看似比较复杂。其实他的不同在于,他需要一个ServletContext来模拟我们的请求和响应。但是Spring也针对Spring MVC 提供了请求和响应的模拟测试接口,以方便我们的单元测试覆盖面不只是service,dao层。

用到的注解
  • RunWith(SpringJUnit4ClassRunner.class): 表示使用Spring Test组件进行单元测试;
  • WebAppConfiguration: 使用这个Annotate会在跑单元测试的时候真实的启一个web服务,然后开始调用Controller的Rest API,待单元测试跑完之后再将web服务停掉;作用是模拟ServletContext
  • ContextConfiguration: 指定Bean的配置文件信息,可以有多种方式,这个例子使用的是文件路径形式,如果有多个配置文件,可以将括号中的信息配置为一个字符串数组来表示;

基本框架

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:**web-config.xml")
@WebAppConfiguration
public class MockMvcTest {
    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext webApplicationContext;

    @Before
    public void setUp() throws Exception {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }

    @Test
    public void demo() throws Exception {
        mockMvc.perform(get("/demo/test").accept(MediaType.parseMediaType("application/json;charset=UTF-8")))
               .andExpect(status().isOk())
               .andExpect(content().contentType("application/json;charset=UTF-8"))
               .andExpect(content().json("{'foo':'bar'}"));
    }
}

解释:

  • 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;然后进行自定义验证/进行下一步的异步处理(对返回的数据进行的判断);

校验Controller处理之后,请求是否为成功状态,返回的内容是否包含了例如"{'foo':'bar'}"字符串。

1 mockMvc调用perform,调用controller的业务处理逻辑

2 perform返回ResultActions,返回操作结果,通过ResultActions,提供了统一的验证方式。

3 使用StatusResultMatchers对请求结果进行验证

4 使用ContentResultMatchers对请求返回的内容进行验证

注意:在实际应用中如果应用到了数据库,在测试过程可能对数据库的增删,可能产生脏数据,可以在类上添加事务回滚的注解。
//配置事务的回滚,对数据库的增删改都会回滚,便于测试用例的循环利用
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional

使用“.属性”获取json里面的数据,如我要获取返回数据中的"data.name",可以写成".data.name"

{
    "status":200,
    "data":{"id":"2","name":"测试"}
}

相关文章

  • Junit测试 - mockMVC

    使用mock工具可以直接模拟http请求,不用直接产生网络的请求环境,简化了测试流程。 MockMvc实现了对Ht...

  • IDEA配置JUnit进行单元测试

    安装JUnitGenerator V2.0 JUnit可以运行JUnit测试文件,但无法自动生成JUnit测试代码...

  • JUnit

    JUnit是用于编写可重复测试的单元测试框架,可实现自动化测试。JUnit官方API文档:http://junit...

  • 自动装配bean 2.2节

    使用junit测试,自动装配 不是junit测试的话,会在web.xml中配置识别注解的xml junit使用下面...

  • JUnit4.12入门实践

    内容概要: 为什么要做单元测试 JUnit简介 单元测试规范 JUnit4常用注解 JUnit4异常和超时测试 J...

  • 测试

    Junit测试

  • junit测试--java13(09/12/2015)

    Junit测试: 1、右键--build path--add library--Junit--Junit4--fi...

  • IDEA 中 JUnit 的使用

    目录 JUnit 是什么? IDEA 的 JUnit 配置 测试类的生成 测试覆盖率的查看 1. JUnit 是什...

  • Java测试工具和框架(一)

    JUnit单元测试框架(白盒测试) 1、下载 JUnit的jar包 jar包地址(junit4.10) 2、Bui...

  • SpringBoot多数据源集成Mybatis是出现的Bindi

    1、Junit测试错误截图: 2、Junit测试书写代码:无问题 public class DBInfoTest ...

网友评论

    本文标题:Junit测试 - mockMVC

    本文链接:https://www.haomeiwen.com/subject/bvjwdqtx.html