上一章我们分享了“测试驱动开发(TDD)”。下面我们准备开始使用JUnit、AssertJ和Mockito编写单元测试。在开始编写测试之前,我们需要先把开发环境准备好。主要包括两个环节:

  • 在项目中确定测试代码的存放位置。
  • 在项目中引入上述三大依赖。

下面分别论述。

1. 在项目中确定测试代码的存放位置

测试代码和测试配置文件伴随产品代码的始终,同产品代码一起提交到版本库。

在Maven和Gradle项目中,测试代码应该放置在下面的目录:

src/test/java

而测试用到的资源文件(文本文件、jdbc配置文件、xml文件等等)应该放置在下面的目录:

src/test/resources

如果将测试代码和资源文件放到上述目录下,构建系统会自动找到测试代码并执行测试,不需要额外的配置。

文件布局如下图:

2. 在项目中添加JUnit、AssertJ和Mockito三大依赖

目前最流行的项目构建系统是Maven和Gradle。另一个构建系统Ant已经严重落伍,所以不再讲述。

2.1 在Maven中添加JUnit、AssertJ和Mockito三大依赖

在pom.xml文件中添加下面的内容:

<dependencyManagement><dependencies><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.6.2</version><scope>test</scope></dependency><dependency><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId><version>5.6.2</version><scope>test</scope></dependency><dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>3.3.3</version><scope>test</scope></dependency><dependency><groupId>org.assertj</groupId><artifactId>assertj-core</artifactId><version>3.16.1</version><scope>test</scope></dependency><!--此处添加其他项目需要的依赖--></dependencies></dependencyManagement><dependencies><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId></dependency><dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId></dependency><dependency><groupId>org.assertj</groupId><artifactId>assertj-core</artifactId></dependency><!-- 此处添加其他项目需要的依赖--></dependencies>

通过定义dependencyManagement节,统一管理项目各个依赖项的版本和应用范围等等。这样在dependencies节中定义项目需要的依赖的时候就不再需要指定版本和应用范围。

记住这三大依赖都只用于测试,不是产品代码的一部分,因此它们的都是test而不是compile。因为默认scope就是compile,如果不将scope显式设定为test,最终产品中就可能会包含测试相关的各种类库(jar),这是你所不希望的。

上面我们采用的是JUnit5,如果你还是习惯编写JUnit4或者3的单元测试,就还需要加上这么一个依赖项:junit-vintage-engine。

<dependency><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId><version>5.6.2</version><scope>test</scope>
</dependency>

另外,用于执行单元测试的surefire插件的版本也要用比较新的新本才能支持JUnit5:

<build><pluginManagement><plugins><plugin><artifactId>maven-surefire-plugin</artifactId><version>2.22.1</version></plugin><!--其他插件--></plugins></pluginManagement><!--其他内容--></build>

2.2 在Gradle中添加JUnit、AssertJ和Mockito三大依赖

在build.gradle文件中写下如下代码来支持运行 Junit Platform:

test {useJUnitPlatform()
}

同时引入测试依赖:

dependencies { testImplementation("org.junit.jupiter:junit-jupiter-api:5.6.2") testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.6.2") testCompile("org.mockito:mockito-core:3.3.3")testCompile("org.assertj:assertj-core:3.16.1")//如果项目中包含JUnit4或3的测试,还需要加入下面一行testRuntimeOnly("org.junit.vintage:junit-vintage-engine:5.6.2")
}

3. 测试类命名等相关建议

有下面一些建议:

  • 测试类和被测类定义在相同的包里面。

这主要是从方法可访问性的角度考虑的。我们不仅要测试被测类的public方法,有时可能还需要测试protected方法和包级私有的方法。如果测试类和被测类位于相同的包,测试类就可以访问以及测试被测类的protected和包级私有方法,否则可能没有办法测试这些方法。

  • 每个工作单元对应一个测试类。

这意味着每个被测类对应多个测试类,而不是每个被测类对应一个测试类。

因为被测类往往有多个工作单元(非private方法),而每个工作单元往往需要编写一组单元测试。如果将对应一个被测类的单元测试都写在同一个测试类里面,会导致测试类很复杂,而且不够内聚,模糊了焦点。

单元测试关注的粒度是工作单元而不是类,所以应该基于工作单元来定义测试类。

如果针对一个工作单元的一组测试类的测试前准备和测试后清理工作差别比较大,也可以继续划分。

另外,每个参数化测试通常需要单独一个测试类。

  • 测试类名以Test为后缀,最好也以被测类的类名和被测方法名为前缀。例如AccountWithdrawTest

这样做一方面从可读性来说表现更好,另一方面可以方便构建系统根据命名模式筛选出真正的测试类。

在src/test/java目录中,除了测试类之外也可能包含一些辅助类、工具类。也可能存在测试基类,作为其他测试类的共同父类。这个时候制定测试类的命名模式就很重要了。下面是maven中的单元测试插件surefire的配置:它只选择了类名以Test为后缀,并且前缀不是Abstract和Base的类来执行测试:

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration><includes><include>**/*Test.java</include></includes><excludes><exclude>**/Abstract*.java</exclude><exclude>**/Base*.java</exclude></excludes></configuration></plugin>

这一章我们就讲到这里,下一章我们讲讲“使用JUnit编写和执行单元测试”!

powermockito测试私有方法_使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (十)在项目中准备测试环境...相关推荐

  1. 原创 | 使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (一)什么是单元测试

    If builders built buildings the way programmers wrote programs, then the first woodpecker that came ...

  2. 原创 | 使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (六)测试哪些内容:Right-BICEP

    上一章通过实例讲了"第一个单元测试"到底应该怎么做,这一章我们讲讲"对一个工作单元需要测试它哪些方面的内容"? 有6个值得测试的部位,统称为:Right-BIC ...

  3. 测试框架 如何测试私有方法_高效的企业测试–测试框架(5/6)

    测试框架 如何测试私有方法 本系列文章的这一部分将介绍测试框架以及我在何时以及是否应用它们方面的想法和经验. 关于测试框架的想法 我对大多数测试框架不太满意的原因是,按照我的观点,它们大多增加了语法上 ...

  4. 测试私有方法_史上最轻量!阿里开源了新型单元测试Mock工具

    点击上方蓝色字体,选择"设为星标" 回复"666"获取面试宝典 TestableMock是基于源码和字节码增强的Java单元测试辅助工具,包含以下功能: 访问被 ...

  5. 单元测试 代码里面都绝对路径怎么处理_原创 | 编写单元测试和实践TDD (六)测试哪些内容:Right-BICEP...

    上一章通过实例讲了"第一个单元测试"到底应该怎么做,这一章我们讲讲"对一个工作单元需要测试它哪些方面的内容"? 有6个值得测试的部位,统称为:Right-BIC ...

  6. powermockito测试私有方法_03 增强测试: 静态、私有方法处理

    mockito 已经很强大,能帮我们完成大部分 mock 工作,但是对于一些特殊方法来说,还是无能为力. 例如,当我们使用系统获取当前时间戳的时候,可能会调用 System.currentTimeMi ...

  7. JUnit 3.8 通过反射测试私有方法

    测试私有(private)的方法有两种: 1)把目标类的私有方法(修饰符:private)修改为(public),不推荐,因为修改了源程序不佳 2)通过反射 (推荐) 代码演示: 目标程序 Priva ...

  8. python方法测试怀孕_在Python中测试私有方法(例外)

    在阅读了关于在Python中测试私有方法的内容之后,特别是在How do I unit test the methods in a method object?处引用了接受的答案,看来最好只测试公共接 ...

  9. mockito+junit 单元测试 测试私有方法利用反射去调用提升覆盖率 反射调用时传入参数为 null

    今天公司安排我写单元测试 因为要通过三级认证 公司要求是覆盖率必须达到100% 而在写单元测试的时候 对于是否要测试私有方法一直是一个争议 公司规范 对私有方法也进行测试 代码如下: private ...

  10. 编写单元测试代码遵守BCDE原则,以保证被测试模块的交付质量,那么下列说法正确的是

    多选 编写单元测试代码遵守BCDE原则,以保证被测试模块的交付质量,那么下列说法正确的是:答案在文末 A. Border,边界值测试,包括循环边界.特殊取值.特殊时间点.数据顺序等. B. Corre ...

最新文章

  1. 图片加载完成再执行事件
  2. Linux shell脚本中的命令正确写法
  3. LINUN 网络连接小记
  4. mysql 转义字符6_MySQL的转义字符
  5. 高性能滚动 scroll 及页面渲染优化
  6. java书籍_还搞不定Java多线程和并发编程面试题?你可能需要这一份书单!
  7. 极客大学架构师训练营-架构师技术图谱-大作业二
  8. 刷机-升级到3.90M33的方法
  9. 9月1日起施行《中华人民共和国数据安全法》发布(附全文
  10. 天涯论坛_全球华人网上家园_天涯社区
  11. Vue基础知识总结 11:前端路由vue-router
  12. window 10 金蝶KIS SPR32X30.OCX不能正确注册
  13. Beta周王者荣耀交流协会第六次会议
  14. Fckeditor2.6图片上传,JS没有权限_se7en3_新浪博客
  15. OSChina 周一乱弹 ——生死之际还能从容装逼,先生大才
  16. C语言输出整数部分和小数部分
  17. Python 中文分词:jieba库的使用
  18. i219v微星 驱动_Intel英特尔I217/I218/I219系列网卡驱动下载
  19. 贴片共模电感有没有分方向
  20. 从零开始的nwjs(0.69.1)打包生成exe(防坑)

热门文章

  1. Linux文件系统Ext2,Ext3,Ext4性能大比拼
  2. 服务器托管用户支招选择IDC经验
  3. TX2不支持TensorRT INT8,int8 官方参考
  4. 微积分知识总览(0)
  5. 对文字颜色从左到右(横向)渐变的一点理解(坑)
  6. 转载:Charles 使用过程中遇到问题
  7. 《数据虚拟化:商务智能系统的数据架构与管理》一 1.8 数据虚拟化的不同实现...
  8. Codeforces 768B - Code For 1(分治思想)
  9. 树莓派 之 关于用途
  10. WebStorm中配置node.js(Windows)