springboot+mybatis+mockito单元测试

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就行

经验分享 程序员 微信小程序 职场和发展