简介
为了提升代码质量,避免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()方法
判断两个对象是否相等,并返回boolean,int等类型,前为期望值,后为输入值。
assertEquals(返回值,Object expected,Object actual);
2)assertTrue()/assertFalse()
判断测试的对错,condition是期望,message是实际值。
assertTrue(condition,message);
或assertFalse(condition,message);
3)assertArrayEquals()
判断两个数组是否相等
assertArrayEquals(a[],b[]);