写点什么

java 单元测试代码自动生成

用户头像
范晓刚
关注
发布于: 2021 年 04 月 26 日

单测的本质

  • 是要去发现代码中的问题。

现实中,写单测环节中可能存在的问题

效率方面

  • 手动代码低效,特别是代码重构的时候

  • 有些情况对象稍微大一些,我们就得不停的手动 set,耗费大量时间

质量方面

  • 应付:为了单测而单测

  • 单测不严谨,等于没有

对标

该项目对标 JUnitGenerator V2.0

优劣势

  • 优势

  • 较 JUnitGenerator V2.0 显著提升研发效率。生成代码的调用,和猜测的验证

本插件的特色

  • 自动的生成方法的调用,帮你自动的创建变量、方法的的参数,已随机值的方式生成,无需手动(set)

  • 针对调用完成的方法,根据是否有返回值以及变量自动生成 Assert 的代码,选择性的使用

目前支持的功能

  • 针对于单纯的 javaBean 的 code 生成,适用于 util 类、DDD 中的领域层等等

  • mock 类

  • 生成 Jmockit 风格的单测代码

插件安装

  • 通过插件中心,在线安装,搜索 autoTest


如何使用

  • 添加 pom:配套的 pom:主要用来配合生成单测的代码


<dependency>  <groupId>io.github.xiaogangfan</groupId>  <artifactId>unit-test-api</artifactId>  <version>1.0.1</version></dependency> 
复制代码


  • 在要测试的代码中,右键,选择【generate...】,然后选择【Auto Generation Test Code】,然后会弹出一个对话框,选择要生成单测的方法业务代码:


    public Exam paramStr(String str, Exam e) {        if (viewAnswer == null) {            return null;        }        return this;    }
public boolean canViewAnswer() { if (viewAnswer == null) { return false; } return viewAnswer == 1; }
复制代码


生成后的单测如下:


   @Test    public void testParamStr() {         // Initialize params of the method;        String str = ObjectInit.random(String.class);        Exam e = ObjectInit.random(Exam.class);        Exam invokeResult = exam.paramStr(str, e);
// Write the Assert code //Assert.assertEquals(expected, actual); //Assert.assertEquals(expected, invokeResult); }
@Test public void testCanViewAnswer() { Boolean invokeResult = exam.canViewAnswer();
// Write the Assert code //Assert.assertEquals(expected, actual); //Assert.assertEquals(expected, invokeResult); }
复制代码


  • 针对于需要 mock 的代码,比如 xxService 业务代码:对第三方的 api 调用是需要 mock 的


public boolean canGoWorld(String batchId) {        SimpleResultDTO<SimpleBatchInfoDTO> resultDTO = inspectHsfService.searchBatch(batchId);        if (!resultDTO.isSuccess() || resultDTO.getData() == null) {            log.error("batchId [" + batchId + "] searchBatch fail,detail:" + JSON                .toJSONString(resultDTO));            throw new RuntimeException("调用RCP异常");        }        if (StringUtils.equals(BatchStatusEnum.NO_COMPLETE.name(), resultDTO.getData().getStatus())) {            return true;        }        return false;    }
复制代码


单测代码: 这里会把需要 mock 的数据,猜测出来,然后开发可以自由的去调整,目前是基于 Jmockit 来实现的


    @Test    public void testCanGoWorld() {         // Initialize params of the method;        String batchId = ObjectInit.random(String.class);        new Expectations() {{            //inspectHsfService.searchBatch(batchId);            //result = ObjectInit.random(SimpleResultDTO<SimpleBatchInfoDTO>.class);// mock的返回值,这里可以手动的修改,ObjectInit是工具类,随机初始化bean        }};        Boolean invokeResult = taskService.canGoWorld(batchId);// 如果有调用的返回值,下面的Assert也会提示要验证这个值
//new Verifications() {{ //}}; // Write the Assert code //Assert.assertEquals(expected, actual); //Assert.assertEquals(expected, invokeResult); }
复制代码


发布于: 2021 年 04 月 26 日阅读数: 45
用户头像

范晓刚

关注

还未添加个人签名 2020.03.16 加入

还未添加个人简介

评论

发布
暂无评论
java单元测试代码自动生成