参考书籍《单元测试的艺术》
一、单元测试的定义
一个单元测试是一段代码(通常是一个方法),这段代码调用另一段代码(一个单元可以是一个方法或函数),然后检验某些假设的正确性。如果这些假设是正确的,单元测试就成功了,反之单元测试就失败了。
二、单元测试的价值
(1)帮助发现代码缺陷;
(2)修改或重构代码时确保不会影响现有功能;
三、单元测试书写步骤
(1)在目录下先新建对应测试代码的test包,使之与测试项目有相同的子目录;
(2)导入Jnuit测试包;
(3)找到要测试的类对应的java文件;快捷键Alt+Insert弹出Generate功能界面选择Test...;在Destination package选择对应的目标测试包,并勾选上setup()和teardown()方法;
(4)单元测试类框架结构
public class EmployeeTest {
@Before
public void setUp() {
// 执行运行前准备工作
}
@After
public void tearDown() {
// 执行运行后销毁工作
}
@Test
public void getId() {
// 准备阶段
// 执行阶段
// 验证阶段
}
}
验证阶段需要使用Assert断言方法,常用的有AssetEquals()、AssertTrue()、AssertFalse()、AssertNull()、AssertNotNull()。
四、Mock对象
Mockito是一个最常用的单元测试mock框架。要想在不涉及以来关系的情况下测试代码,就必须学会将依赖mock掉。
Mock对象就是在测试过程中,对那些不容易构建的对象,用一个虚拟对象来替代测试的情形。
1、创建Mock
Project project = Mock(Project.class);
2、打桩stub
when(project.xx()).thenReturn(xx)
//或者
OutputService outputService = mock(OutputService.class);
when(OutputService,"getInstance",project).thenReturn(outputservice);
when(outputservice.xx()).thenReturn()
一般来说,对于测试方法的参数一般是mock对象,可能在这个参数对象调用一些方法需要一些外部依赖,可以提前打桩来自定义调用该方法的返回值!
3、调用方法
OutputService.getInstance(project).xx();
4、验证行为,调用assert()方法
5、对于类中的私有方法,可以采用以下方式处理
Method method = PowerMockito.method(类名.class, "方法名", 参数1类型.class, 参数2类型.class, ...)
method.invoke(类实例, 参数1, 参数2, ...)
五、代码覆盖率
代码覆盖率通常指的是待测试全部代码通过编写测试类后能覆盖到的行,即行覆盖率。(还有其他类型的定义,有兴趣可自行查阅)
在IDEA中可以对整个包、单个类测试覆盖率,方法为:鼠标右键包或类,找到run xxx with coverage命令执行,就会显示出该包或者类的覆盖率。