一、Mock测试定义
Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取比较复杂的对象(如 JDBC 中的ResultSet 对象),用一个虚拟的对象(Mock 对象)来创建以便测试的测试方法。Mock 最大的功能是帮你把单元测试的耦合分解开,如果你的代码对另一个类或者接口有依赖,它能够帮你模拟这些依赖,并帮你验证所调用的依赖的行为
使用场景:
当一个方法中调用第三方服务(第三方接口、数据库操作等)不可用时,或者想要避开此方法的相关依赖,可以对这些第三方类或者依赖类mock掉,绕过(避开、屏蔽、跳过)这些类的方法,让其他服务正常运行,按我们规定的返回值进行处理
一个JUnit4的单元测试用例执行顺序为:
@BeforeClass -> @Before -> @Test -> @After -> @AfterClass;
二、使用方法
1.添加依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
</dependency>
2.使用方法
1)类上添加@RunWith注解,启动junt的SpringRunner
2)使用@InjectMocks注解,将所有的mock类注入到这个对象实例中,因为没有注入spring容器,必须要进行实例化
3)使用@Mock注解,mock一个对象,模拟它的功能,一般出现在@InjectMocks注解对象方法中,当使用@InjectMocks注解的对象方法时,只要出现@Mock声明的对象方法,全都执行虚拟方法,不进入具体实现,因此屏蔽掉了@Mock对象方法,不会影响到其他方法
Mock测试类实现方法
@RunWith(SpringRunner.class)
@Slf4j
public class UserServiceMockTest {
@InjectMocks
private UserService userService=new UserServiceImpl();
@Mock
private UserMapper userMapper;
@Before
public void setUserMapperMock(){
log.info("进入到@Before方法:");
//MockitoAnnotations.initMocks(this);
}
@Test
public void testUserServiceMock(){
User user=new User();
user.setId(2);
user.setDescription("测试Mock");
log.info("进入到@Test方法:");
Mockito.when(userService.queryUserById(user)).thenReturn(user);
log.info("Mock执行结果:{}",userService.testMock("END"));
}
@After
public void testAfter(){
log.info("进入到@After方法:");
}
}
UserServiceImpl类中实现方法
@Override
public User queryUserById(User user) {
testMock(user.getDescription());
return userMapper.selectByPrimaryKey(user.getId());
}
@Override
public String testMock(String str) {
System.out.println(str);
return str;
}
3.输出结果
可以看到执行顺序是正确的,而且在UserServiceImpl类中,屏蔽掉了中queryUserById方法的userMapper相关方法,其他正常执行