mockito 打桩测试框架

对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对象的某个方法得到调用, 不抛异常,说明验证通过

}

发布了78 篇原创文章 · 获赞 12 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_29883183/article/details/88219307