我们为什么需要Mock?
当我们进行单元测试时,如果依赖的对象出现了问题,就算被测试的对象本身并无问题,也会导致测试案例的失败;又或者,被测试对象里需要使用一些难以获取的依赖对象时,如与数据库交互的Mapper层等。
我们只想对被测试对象本身进行测试,要排除其他的干扰,与其他组件的联合测试,放在集成测试就好了,单元测试不应该被外界打扰。
为了屏蔽掉这些外界的干扰,我们提出了Mock思想:mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。
当我们依赖外部对象时,使用mock改为调用一个虚拟的、模拟出来的对象来代替,以尽可能的屏蔽外界的干扰。如图,对A类进行测试时,我们将B、C类用其Mock对象替换。
Mock思想是一个广泛通用的思想,在许多语言、测试层里,都会用到。这里主要介绍在Java语言里做单元测试时的Mock工具 - Mockito。
Mockito介绍
Mockito 是一个简单的流行的 Mock 框架。它能够帮我们创建 Mock 对象,保持单元测试的独立性。SpringBoot默认的Mock框架是Mockito,和junit一样,只需要依赖spring-boot-starter-test就可以了。
引如Mockito 的依赖也特别简单,如果你是Maven工程,只需要加入如下依赖:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.5.15</version>
<scope>test</scope>
</dependency>
创建Mock对象
使用Mockito创建对象的方式有两种。比如,我们想把userService中的与数据库连接的Mapper对象Mock掉时:
1.通过方法创建
class MockitoTest {
private UserMapper mockUserMapper;
private UserServiceImpl userService;
@Before
public void setup() {
mockUserMapper = mock(UserMapper.class);
userService = new UserServiceImpl();
userService.setUserDao(mockUserMapper);
}
}
<