springboot、mybatis这里不做详细介绍,重点介绍一下mockito是什么,以及怎么与springboot、mybatis集成。
mockito是什么?举个简单例子:当service层通过调用dao层接口获取数据,然后进行数据处理。在实际做单元测试时,dao层的数据是从数据库来的,我们想自己构造一些数据跑一下service层的业务逻辑,这个时候就需要将从数据库查询的时候替换为自己构造的数据,也就是service层调用的dao层接口返回的数据需要替换为自己构造的数据,那怎么替换呢?这个时候mockito就帮助我们实现了这一过程。mockito是通过模拟dao层接口调用,在运行service层业务逻辑时,将dao层调用返回的数据替换为自己构造的数据。
具体用法:
方法名 | 描述 |
Mockito.mock(classToMock) | 模拟对象 |
Mockito.verify(mock) | 验证行为是否发生 |
Mockito.when(methodCall).thenReturn(value1).thenReturn(value2) | 触发时第一次返回value1,第n次都返回value2 |
Mockito.doThrow(toBeThrown).when(mock).[method] | 模拟抛出异常。 |
Mockito.mock(classToMock,defaultAnswer) | 使用默认Answer模拟对象 |
Mockito.when(methodCall).thenReturn(value) | 参数匹配 |
Mockito.doReturn(toBeReturned).when(mock).[method] | 参数匹配(直接执行不判断) |
Mockito.when(methodCall).thenAnswer(answer)) | 预期回调接口生成期望值 |
Mockito.doAnswer(answer).when(methodCall).[method] | 预期回调接口生成期望值(直接执行不判断) |
Mockito.doNothing().when(mock).[method] | 不做任何返回 |
reset(mock) | 重置mock |
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTest {
@InjectMocks
private UserHandleServiceImpl userHandleServiceImpl;
@Mock
private UserHandleDao userHandleDao
}
- @Mock:创建一个Mock,模拟被调用对象
- @InjectMocks:创建一个实例,其余用@Mock(或@Spy)注解创建的模拟对象将被注入到用该实例中。
- @Autowird 等方式完成自动注入。在单元测试中,没有启动 spring 框架,此时就需要通过
InjectMocks完成依赖注入。
注意点:实际调用方法传入的参数必须跟预先设定“假执行”的方法参数一致,否则不生效。
* 如下:预先定义“假执行”userHandleDao.findUserListByCode("1001")的方法参数是1001,
* 那么userHandleServiceImpl.findUserListByCode("1001")传入的但是也必须为1001
另一种情况:service层跟dao层方法参数实在做不到一致。
* 如下:service层userHandleServiceImpl.findUserByParam("1004", "李四");
* dao层userHandleDao.findUserAll(Student);
* 这种情况我们使用Mockito.isA(Student.class); 定义只有方法参数
* 是类对象Student就行