Mockito学习
Mock模拟
mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法
Mockito好处
·无手写:无需自己编写模拟对象.
·重构安全:重命名接口方法名称或重新排序参数不会破坏测试代码,因为Mocks是在运行时创建的.
·返回值支持:支持返回值.
·异常支持:支持例外.
·订单检查支持:支持检查方法调用的顺序.
·注释支持:支持使用注释创建模拟.
Mockito集成
引入依赖
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>3.3.3</version> <scope>test</scope> </dependency> |
Mockito的使用
初始化
@Before public void initMocks() { MockitoAnnotations.initMocks(this); } |
或者
//引入依赖 @RunWith(MockitoJUnitRunner.class) public class MockitoTest { } |
注解
@Mock
用于模拟对象,有助于减少重复模拟对象
注意:@Mock注释始终与@RunWith注释一起使用。
@RunWith:这是一个类级别的注释。它用于保持测试干净并改善调试。它还会检测测试中可用的未使用的存根,并使用@Mock注释对模拟进行初始化
@InjectMocks
它标记应在其上执行注入的字段或参数
@Captor
它允许创建字段级参数捕获器。它与Mockito的verify()方法一起使用,以获取调用方法时传递的值。
@Spy
允许创建部分模拟的对象。换句话说,它允许将现场实例快速包装在测试对象中
创建一个实例
package com.example.sl.demospringboot; import com.example.sl.demospringboot.dao.UserMapper; import com.example.sl.demospringboot.model.User; import com.example.sl.demospringboot.service.UserService; import com.example.sl.demospringboot.service.UserServiceImpl; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.*; import org.mockito.junit.MockitoJUnitRunner; import java.util.List; import java.util.Map; import static org.mockito.Mockito.*; //引入依赖 @RunWith(MockitoJUnitRunner.class) public class MockitoTest { //初始化Mokc注解对象或者@RunWith(MockitoJUnitRunner.class) // @Before // public void initMocks() { // MockitoAnnotations.initMocks(this); // } //模拟一个对象 @Mock private Map map; @InjectMocks private UserServiceImpl userServicei; @Mock private UserService userService; @Mock private UserMapper userMapper; @Test public void test1(){ User user=mock(User.class); when(user.getUsername()).thenReturn("快乐"); //当调用user.getUsername()返回“快乐” Assert.assertEquals("快乐",user.getUsername()); Assert.assertTrue(map instanceof Map); //当调用user.getUsername()抛空指针 Mockito.doThrow(new NullPointerException()).when(user.getUsername()); //当调用user的时候什么事情也不用做 Mockito.doNothing().when(user); map.size(); //verify检测方法调用,这表明size方法调用一次 verify(map,times(1)).size(); } /** * 捕获参数 */ @Test public void testGetParam(){ String param="我是一个参数"; //模拟一个List对象 List listO=Mockito.mock(List.class); ArgumentCaptor<String> paramObject = ArgumentCaptor.forClass(String.class);//捕获参数的对象 listO.add(param);//mock对象执行add方法,将test添加进其中 verify(listO).add(paramObject.capture());//捕获参数 Assert.assertEquals("我是一个参数", paramObject.getValue());//断言验证 } /** * 模拟数据库查询一个User */ @Test public void testGetUser(){ User user=new User(); user.setAge(1); //调用方法返回一个实体 when(userServicei.findUser()).thenReturn(user); // System.out.println("userService.findUser().getAge() = " + userServicei.findUser().getAge()); Assert.assertEquals("1",userServicei.findUser().getAge()+""); verify(userMapper).getUser(); } /** * 调用接口发方法进行测试 * 设置超时时间 */ @Test(timeout = 1000) public void testInterface() throws InterruptedException { User user=new User(); user.setUsername("test"); //调用userService.findUser()返回一个usaer when(userService.findUser()).thenReturn(user); Assert.assertEquals("test",userService.findUser().getUsername()); //验证执行几次 verify(userService).findUser(); } } |
注意
@InjectMocks创建一个实例,也就是一个包含注入接口或者其他bean的一个对象
@Mock是一个实例里面的一个注入对象,对应的是spring的一个bean
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理