当前位置:   article > 正文

Java编程技巧之单元测试用例简化方法_java 编写测试用例

java 编写测试用例

前言

清代谴责小说家吴趼人在《痛史》中写道:“卷帙浩繁,望而生畏。

意思是:“ 一部书的篇幅太长,让人看见就害怕。”编写单元测试用例也是如此,如果单元测试用例写起来又长又复杂,自然而然地会让人“望而生畏”,于是开始反感甚至于最终放弃。为了便于Java单元测试的推广,作者总结了十余种测试用例的简化方法,希望能够让大家编写单元测试用例时——“化繁为简、下笔如神”。

1. 简化模拟数据对象

1.1. 利用JSON反序列化简化数据对象赋值语句

利用JSON反序列化,可以简化大量的数据对象赋值语句。首先,加载JSON资源文件为JSON字符串;然后,通过JSON反序列化JSON字符串为数据对象;最后,用该数据对象来模拟类属性值、方法参数值和方法返回值。

原始用例:

  1. List<UserCreateVO> userCreateList = new ArrayList<>();
  2. UserCreateVO userCreate0 = new UserCreateVO();
  3. userCreate0.setName("Changyi");
  4. ... // 约几十行
  5. userCreateList.add(userCreate0);
  6. UserCreateVO userCreate1 = new UserCreateVO();
  7. userCreate1.setName("Tester");
  8. ... // 约几十行
  9. userCreateList.add(userCreate1);
  10. ... // 约几十条
  11. userService.batchCreate(userCreateList);

简化用例:

  1. String text = ResourceHelper.getResourceAsString(getClass(), path + "userCreateList.json");
  2. List<UserCreateVO> userCreateList = JSON.parseArray(text, UserCreateVO.class);
  3. userService.batchCreate(userCreateList);

1.2. 利用虚拟数据对象简化返回值模拟语句

有时候,模拟的方法返回值在测试方法内部并不发生修改,只是起到一个透传的作用而已。对于这种情况,我们只需要模拟一个对象实例,但并不关心其内部具体内容。所以,可以直接用虚拟数据对象替换真实数据对象,从而简化了返回值模拟语句。

被测代码:

  1. @GetMapping("/get")
  2. public ExampleResult<UserVO> getUser(@RequestParam(value = "userId", required = true) Long userId) {
  3. UserVO user = userService.getUser(userId);
  4. return ExampleResult.success(user);
  5. }

原始用例:

  1. // 模拟依赖方法
  2. String path = RESOURCE_PATH + "testGetUser/";
  3. String text = ResourceHelper.getResourceAsString(getClass(), path + "user.json");
  4. UserVO user = JSON.parseObject(text, UserVO.class);
  5. Mockito.doReturn(user).when(userService).getUser(user.getId());
  6. // 调用测试方法
  7. ExampleResult<UserVO> result = userController.getUser(user.getId());
  8. Assert.assertEquals("结果编码不一致", ResultCode.SUCCESS.getCode(), result.getCode());
  9. Assert.assertEquals("结果数据不一致", user, result.getData());

简化用例:

  1. // 模拟依赖方法
  2. Long userId = 12345L;
  3. UserVO user = Mockito.mock(UserVO.class); // 也可以使用new UserVO()
  4. Mockito.doReturn(user).when(userService).getUser(userId);
  5. // 调用测试方法
  6. ExampleResult<UserVO> result = userController.getUser(userId);
  7. Assert.assertEquals("结果编码不一致", ResultCode.SUCCESS.getCode(), result.getCode());
  8. Assert.assertSame("结果数据不一致", user, result.getData());

1.3. 利用虚拟数据对象简化参数值模拟语句

有时候,模拟的方法参数值在测试方法内部并不发生修改,只是起到一个透传的作用而已。对于这种情况,我们只需要模拟一个对象实例,但并不关心其内部具体内容。所以,可以直接用虚拟数据对象替换真实数据对象,从而简化参数值模拟语句。

被测代码:

  1. @GetMapping("/create")
  2. public ExampleResult<Void> createUser(@Valid @RequestBody UserCreateVO userCreate) {
  3. userService.createUser(userCreate);
  4. return ExampleResult.success();
  5. }

原始用例:

  1. // 调用测试方法
  2. String path = RESOURCE_PATH + "testCreateUser/";
  3. String text = ResourceHelper.getResourceAsString(getClass(), path + "userCreate.json");
  4. UserCreateVO userCreate = JSON.parseObject(text, UserCreateVO.class);
  5. ExampleResult<Void> result = userController.createUser(userCreate);
  6. Assert.assertEquals("结果编码不一致", ResultCode.SUCCESS.getCode(), result.getCode());
  7. // 验证依赖方法
  8. Mockito.verify(userService).createUser(userCreate);

简化用例:

  1. // 调用测试方法
  2. UserCreateVO userCreate = Mockito.mock(UserCreateVO.class); // 也可以使用new UserCreateVO()
  3. ExampleResult<Void> result = userController.createUser(u
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/274040
推荐阅读
相关标签
  

闽ICP备14008679号