springboot+mybatis+mockito单元测试
springboot、mybatis这里不做详细介绍,重点介绍一下mockito是什么,以及怎么与springboot、mybatis集成。
mockito是什么?举个简单例子:当service层通过调用dao层接口获取数据,然后进行数据处理。在实际做单元测试时,dao层的数据是从数据库来的,我们想自己构造一些数据跑一下service层的业务逻辑,这个时候就需要将从数据库查询的时候替换为自己构造的数据,也就是service层调用的dao层接口返回的数据需要替换为自己构造的数据,那怎么替换呢?这个时候mockito就帮助我们实现了这一过程。mockito是通过模拟dao层接口调用,在运行service层业务逻辑时,将dao层调用返回的数据替换为自己构造的数据。
具体用法:
@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就行