测试
Java的单元测试和集成测试是非常重要的。
集成测试
在所有组件都开发完成进行组装测试(所有对应的类都会建立实例来运行程序)。
单元测试
集成测试会构建整个Spring Context,这表示所有声明的bean,都会构建实例。在开发时,为了实现测试的高效,或是定点测试,需要使用Mock技术来屏蔽掉下层的依赖。
Java程序最小的功能单元是方法,因此,对Java程序进行单元测试就是针对单个Java方法的测试。
单元测试有什么好处呢?在学习单元测试前,我们可以先了解一下测试驱动开发。
**所谓测试驱动开发,是指先编写接口,紧接着编写测试。**编写完测试后,我们才开始真正编写实现代码。在编写实现代码的过程中,一边写,一边测,什么时候测试全部通过了,那就表示编写的实现完成了:
即:编写接口-编写测试-编写实现-运行测试(测试失败回退到 编写实现)-任务完成。
Java单元测试主要使用Junit(本文以Junit5为例)。
Junit5
介绍
JUnit 5 与以前版本的 JUnit 不同,拆分成由三个不同子项目的几个不同模块组成。
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
- JUnit Platform: 用于JVM上启动测试框架的基础服务,提供命令行,IDE和构建工具等方式执行测试的支持。
- JUnit Jupiter:包含 JUnit 5 新的编程模型和扩展模型,主要就是用于编写测试代码和扩展代码。
- JUnit Vintage:用于在JUnit 5 中兼容运行 JUnit3.x 和 JUnit4.x 的测试用例。
它的架构如下:
- @Test:Junit会将带有@Test的方法识别为测试方法;
- @BeforeEach和AfterEach,会在运行每个Test方法前后自动运行,因此可以将一些公共的代码段(如实例)设置为以上注解,以便代码格式优美;
PS:其实在Junit的内部运行顺序伪代码如下:
- 即beforeeach和aftereach会环绕在每个test前后。
与之类似的还有,after/before all/class,即在所有test方法或者类之前执行。
- @Disable:可以跳过这个测试(在结果中会显示skipped);
EnableOnOs:可以在指定的系统上运行特定的测试;
- @ParameterizedTest:用于参数化测试;
- DisplayName:可以在测试过程中输出方法的别名;
- ValueSource\EnumSource\MethodSourceCsvSource\ArgumentsSource:可以实现相应内容的注入;
参考链接
单元测试Junit简要例子
https://www.liaoxuefeng.com/wiki/1252599548343744/1255945269146912
Junit5介绍
https://www.jianshu.com/p/3183fb69fd74
SpringBoot集成mybatis
源码:https://www.jianshu.com/p/426dbf8cc64e
Mockito
介绍
Mockito框架是基于将依赖的类设置为**Mock类,**进行单元测试。
何为Mock?
——当测试目标的下层依赖的行为是可预期的,那么测试目标本身的行为也是可以预期的。于是所谓测试就是把实际的结果和测试目标的预期结果做比较,而Mock就是预先设定下层依赖的行为表现。
Mock的流程就是:
- 将测试目标的依赖对象进行mock,设定其预期的行为表现。
- 对测试目标进行测试。
- 检测测试结果,检查在依赖对象的预期行为下,测试目标的结果是否符合预期。
我们使用Mockito,主要是生产mock对象,以及,使用mock所提供的一些方法来验证结果的正确性。
参考链接
Mockito简单上手