对UserServiceImpl的测试UserServiceImpl 或 UserServiceDao的单元测试UserDaoImpl
在测试的时候,有时我们要达到一些覆盖率指标,或者即使不是因为覆盖率指标我们也会遇到这种问题:
测试方法A中调用了其他方法B,而B方法因某些原因不能成功调用或我们不想调用B方法。
我们需要一套机制,让测试增加可控,我们能比较自由的测试想要测试的部分,
mockito就是帮助我们完成这件工作的工具。
mockito的主要作用有两个:
验证某实例的某方法在测试中是否被调用、被调用了多少次
跳过某实例的某方法的实际执行内容,
直接返回我们设置的结果
mockito是单元测试的利器,我们开始说过,
单元测试是专注于方法内部,最小单元的测试,在其中我们或许会难免涉及其他服务的方法调用等,
我们可以利用mockito来跳过这些步骤。mock这个单词的意义就是虚假、愚弄,
我们用一个自己创建的假对象替换真实的对象达到我们的效果,并不会对原类、原对象产生改变性的影响。
利用微服务框架提供的Mock机制,可以分别生成模拟消费者的客户端测试桩和提供者的服务端测试桩,双方可以基于Mock测试桩对微服务的接口契约进行测试,双方都不需要等待对方功能代码开发完成,实现了并行开发和测试,提高了微服务的构建效率。基于接口的契约测试还能快速的发现不兼容的接口变更,例如修改字段类型、删除字段等。
Mockito.when(mapper.get(0)).thenReturn(user);
//当遇到依赖的外部资源时,对外部资源进行打桩、模拟。从而达到对该方法的逻辑正确性进行测试的目的,
对方法进行打桩,返回一个自己定义好的对象
mockito3个注解的使用:
@InjectMocks: 创建一个实例 即你要单元测试类 userServiceImp
@Mock: 创建一个Mock. (其他接口,使用@Mock或@Spy注解注入到该实例中userServiceImp)
注意:必须使用@RunWith(MockitoJUnitRunner.class) 或 Mockito.initMocks(this)进行mocks的初始化和注入
@RunWith(MockitoJUnitRunner.class)
public class UserServiceImplTest {
@InjectMocks
UserServiceImp userServiceImp;
@Mock
private JdbcTemplate jdbcTemplateMock;
@Mock
UserMapper mapper; //此mock将被注入到userServiceImp
@Before
public void before(){
MOCKITOannotations.initMocks(this);
}
@Test
public void testGet(){
User user = new User();
user.setName("huaAn");
user.setId(0);
user.setAccount("9527");
Mockito.when(mapper.get(0)).thenReturn(user);
mockito在测试的时候,有时我们要达到一些覆盖率指标
1、校验方法是否调用
Mockito提供vertify关键字来实现校验方法是否被调用,具体调用如下例子:
@Test
public void update() throws Exception {
boolean result = personService.update(1, "new name");
//验证mockDao的getPerson是否被调用
verify(mockDao).getPerson(1);
}
//运行结果正确,因为我们在执行update时,调用了getPerson
public boolean update(int id, String name) {
Person person = personDao.getPerson(id);
if (person == null) {
return false;
}
Person personUpdate = new Person(person.getId(), name);
return personDao.update(personUpdate);
}
org.junit.Assert.assertTrue(userServiceImp.getUser(0).equals(user));
Mockito.verify(jdbcTemplateMock).queryForlist(sql); //这里可以省略Mockito. ,注意jdbcTemplateMock是一个dao接口,用verify()包住
//验证一个jdbcTemplate对象的某个方法得到调用, 不抛异常,说明验证通过
}