SpringBootTest的Mock测试

发表于:2022-5-25 09:10

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:今晚上吃鱼    来源:稀土掘金

  mock 模拟mvc请求
  mock ,意为 模仿、模拟。
  当我们需要在web环境下进行接口测试时,一种是直接启动启动,使用postman 或者 apipost 这种工具进行测试,但无法进行自动化。今天我们使用springTest 提供的 mock 功能进行模拟测试。
  主要分为四个步骤:
  创建 web 测试环境
  ·使用 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 开启测试功能 ,并同时设置 web 环境
  ·使用 @AutoConfigureMockMvc 开启mockMvc 自动配置
  @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
  @AutoConfigureMockMvc
  class ZssmpApplicationTests {
  }

  注入mockMvc 对象
  ·以成员变量的方式注入 mockMvc
  @Autoeired 
  private MockMvc mockMvc;

  · 以方法参数的形式注入
  @SpringBootTest
  @AutoConfigureMockMvc
  class ZssmpApplicationTests {
     @Resource
     private BookDao bookDao;
     //测试mvc
     @Test
     void testMvc(@Autowired MockMvc mockMvc) throws Exception {
       
     }

  发起虚拟请求
  //创建虚拟请求
  MockHttpServletRequestBuilder mockHttpServletRequestBuilder = MockMvcRequestBuilders.get("/books");
  //执行请求
  ResultActions actions = mockMvc.perform(mockHttpServletRequestBuilder);

  断言测试结果
  匹配响应状态
  //1. 定义执行状态匹配器
  StatusResultMatchers matchers = MockMvcResultMatchers.status();
  //2. 定义预期执行状态
  ResultMatcher ok = matchers.isOk();
  //3.使用本次真实执行结果 与 预期结果 进行比较 ,会自动断言
  actions.andExpect(ok);

  匹配响应体
  ContentResultMatchers content = MockMvcResultMatchers.content();
  ResultMatcher contentMatcher = content.string("springboot return");
  actions.andExpect(contentMatcher);

  匹配json响应
  ContentResultMatchers content1 = MockMvcResultMatchers.content();
  ResultMatcher jsonMatcher = content.json("{"id":1,"type":"spring学习非常有趣0","name":"spring学习非常有趣0","description":"spring学习非常有趣0"}");
  actions.andExpect(jsonMatcher);

  匹配响应头
  HeaderResultMatchers header = MockMvcResultMatchers.header();
  ResultMatcher contentType = header.string("Content-Type", "application/json");
  actions.andExpect(contentType);

  业务层的测试回滚
  在测试过程中不可避免地会产生一些脏数据,这时候我们可以使用事务管理来解决这个问题。
  当 @Transactional 与 @SpringBootTest 组合使用时,springBootTest 会识别到该测试类的事务默认都进行回滚。因此,我们只需要像下面这样,即可实现完成测试过程,又不会将测试结果持久化到数据库中。
  @SpringBootTest
  @Transactional
  class ZssmpApplicationTests {
  }

  这时候有人会问,在测试过程中某个方法我需要将结果持久化到数据库。这时候,我们只需要在指定的方法上添加 @Rollback(false) 即可实现事务不回滚。
  @Test
  @Rollback(false)
  void save() {
     Book book = new Book();
     book.setName("test");
     book.setType("测试type2");
     bookDao.insert(book);
  }

  生成随机测试数据
  当我们需要生成一些测试数据时, 我们可以使用如下的方式即可。
  testcase:
      bookcase:
          id: ${random.int}
          name: 测试名称${random.value}
          uuid: ${random.uuid}
          time: ${random.long}
          lessThanInt: ${random.int(10)}
          rangInt: ${random.int(100,200)}

  @Data
  @Component
  @ConfigurationProperties(prefix = "testcase.bookcase")
  public class BookCase {
      private int id;
      private String name;
      private String uuid;
      private Long time;
      private int lessThanInt;
      private int rangInt;
  }

  生成的随机数据结果如下:
  {
      "id": -742894216,
      "name": "测试名称2b671f9730797d91c179561b2aa4d068",
      "uuid": "935319f6-d8f0-4ff7-b614-b99bf44b50b6",
      "time": 1855781803752693206,
      "lessThanInt": 6,
      "rangInt": 141
  }

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号