jar包依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<version>2.0.2.RELEASE</version>
</dependency>
容器注册
由于xxxService在业务开发中是交由spring容器管理的,所以在执行单元测试的时候也需要手动把此目标测试类添加到容器中,然后就可以在对应的测试类中使用属性注入的方式( @Autowired )进行注入和使用了。
@SpringBootTest
@ContextConfiguration(classes = {xxxService.class})
Mockito依赖的数据
Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取比较复杂的对象(如 JDBC 中的ResultSet 对象),用一个虚拟的对象(Mock 对象)来创建以便测试的测试方法。
进行单元测试的方法中依赖了其他被mock掉的bean;(使用 @MockBean 注解的)为了保证当前方法的顺利进行,需要使用
Mockito.when
进行数据补充。详情看文章结尾的示例
断言
指定传入参数,预估返回的结果,对返回结果进行断言,保证此方法在后续迭代中如果发生了变化,单元测试能够预警。
断言的方法有
void assertEquals(boolean expected, boolean actual):检查两个变量或者等式是否平衡
void assertTrue(boolean expected, boolean actual):检查条件为真
void assertFalse(boolean condition):检查条件为假
void assertNotNull(Object object):检查对象不为空
void assertNull(Object object):检查对象为空
void assertSame(boolean condition):assertSame() 方法检查两个相关对象是否指向同一个对象
void assertNotSame(boolean condition):assertNotSame() 方法检查两个相关对象是否不指向同一个对象
void assertArrayEquals(expectedArray, resultArray):assertArrayEquals() 方法检查两个数组是否相等
参数化测试
依次使用不同的参数对同一个单元测试方法进行测试
用 @RunWith(Parameterized.class)来注释 test 类。
创建一个由 @Parameters 注释的公共的静态方法,它返回 一个对象的集合(数组) 来作为测试数据集合。
创建一个公共的构造函数,它接受和一行测试数据相等同的东西。
为每一列测试数据创建一个实例变量。
用实例变量作为测试数据的来源来创建你的测试用例。
待续。。。
示例
@SpringBootTest
@ContextConfiguration(classes = {FeeFormulaFactorDomainService.class})
class FeeFormulaFactorDomainServiceTest {
@MockBean
private FeeFormulaFactorRepository feeFormulaFactorRepository;
@MockBean
private FeeFormulaFactorRelateRepository feeFormulaFactorRelateRepository;
@MockBean
private FeeFormulaFactorRelateDomainService feeFormulaFactorRelateDomainService;
@MockBean
private ObjectMapper objectMapper;
@Autowired
private FeeFormulaFactorDomainService feeFormulaFactorDomainService;
@Test
void create() {
FeeFormulaFactorSaveDto saveDto = new FeeFormulaFactorSaveDto();
//参数名称未传的
FeeFormulaFactorDto feeFormulaFactorDtoReturn;
try {
feeFormulaFactorDomainService.create(feeFormulaFactorRepository, objectMapper, saveDto);
} catch (Exception e) {
//业务异常打印,其他异常抛出
if (e instanceof BusinessLogicException) {
Assertions.assertEquals("【参数名称】为必传参数", e.getMessage());
} else {
throw e;
}
}
//参数名称传入,正常保存
final String factoryNameTest = "参数因子测试名称";
saveDto.setFactorName(factoryNameTest);
FeeFormulaFactorEntity feeFormulaFactorEntityMock = new FeeFormulaFactorEntity();
BeanUtil.copyProperties(saveDto, feeFormulaFactorEntityMock);
Mockito.when(objectMapper.map(saveDto, FeeFormulaFactorEntity.class)).thenReturn(feeFormulaFactorEntityMock);
feeFormulaFactorDtoReturn = feeFormulaFactorDomainService.create(feeFormulaFactorRepository, objectMapper, saveDto);
//验证返回值
Assertions.assertEquals(factoryNameTest, feeFormulaFactorDtoReturn.getFactorName());
assertNotNull(feeFormulaFactorDtoReturn.getFactorNameEn());
assertNotNull(feeFormulaFactorDtoReturn.getFactorNameAlias());
Assertions.assertEquals(0, feeFormulaFactorDtoReturn.getParamCount());
}
}