Mockito单元测试demo

简介

为了提升代码质量,避免bug。开发之后的测试是不可或缺的,以前虽然写了单元测试,但实际上,依赖着数据库和下游服务接口,属于集成测试的范围。并没有很好的对代码进行验证,导致能够在开发环境复现的问题,暴露在生产环境上。修复起来周期较长,浪费开发资源,浪费生命,简单的东西多次去修改。需要有合理的开发和自测流程保证代码质量。同时,单侧也能对代码的风格进行矫正,能够方便进行单元测试的代码是合理的,易扩展的和兼容的。


简单使用

在使用 @Mock 和 @InjectMocks 注释的模拟中,可以通过在 @RunWith() 中指定MockitoJUnitRunner来运行测试。

@RunWith(MockitoJUnitRunner.class)
public class UserServiceMockTest { 

}

以下通过一个demo展示具体单测过程

@RunWith(MockitoJUnitRunner.class)
public class UserServiceMockTest { 

	@Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

  	@Test
    public void testGetUser_MockAnnotation() {
        User mockUser = new User("test-name","test-email@126.com");
        Mockito.doReturn(mockUser).when(userRepository).getUser(mockUser.getName());

        User user = userService.getUser(mockUser.getName());
        Assert.assertEquals(mockUser.getName(), user.getName());
        Assert.assertEquals(mockUser.getEmail(), user.getEmail());

        // 验证 mockUserRepository.getUser() 方法是否执行
        Mockito.verify(userRepository).getUser(mockUser.getName());
        Mockito.verifyNoMoreInteractions(userRepository,userService);
        
    }

}

个人理解

代码中@Mock注解模拟依赖对象,@InjectMock注解用在测试对象上面。
其中Mockito.doReturn(mockUser).when(userRepository).getUser(mockUser.getName()),表示模拟的userRepository对象当调用getUser(mockUser.getName())时就会返回mockUser,目的是用来模拟依赖方法

模拟了依赖对象的方法之后,User user = userService.getUser(mockUser.getName());这里userService中会自动注入@Mock引入的对象,userService中依赖了userRepository对象获取User对象。前面模拟了userRepository的getUser()方法,所以user调用到模拟对象的方法获取到值。

调用获取到模拟对象的返回值之后,对返回数据进行验证。Assert.assertEquals(mockUser.getName(), user.getName());对依赖对象的方法进行验证,Mockito.verify(userRepository).getUser(mockUser.getName());
对依赖对象进行验证,Mockito.verifyNoMoreInteractions(userRepository,userService);
至此,一个通过Mockito进行单元测试的完成。


其他用法

验证verify

 //第一句校验,至少被调用了1次
 Mockito.verify(userRepository, atLeastOnce()).getUser(mockUser.getName());
 //第二句校验,getUser被调用1次
 Mockito.verify(userRepository, times(1)).getUser(mockUser.getName());
 //第三句校验,getUser被调用3次
 Mockito.verify(userRepository, times(3)).getUser(mockUser.getName());
 //第四句校验,从未被调用
 Mockito.verify(userRepository, never()).getUser(mockUser.getName());
    

断言Assert

1)assertEquals()方法
  判断两个对象是否相等,并返回booleanint等类型,前为期望值,后为输入值。
   assertEquals(返回值,Object expected,Object actual);
 
  2)assertTrue()/assertFalse()
   判断测试的对错,condition是期望,message是实际值。
   assertTrue(condition,message);
   或assertFalse(condition,message);
  
  3)assertArrayEquals()
  判断两个数组是否相等
  assertArrayEquals(a[],b[]);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值