Mockito可将依赖部分设置为成功,测试业务流程。如service依赖dao层,mock掉dao层(即假设dao正确返回需要的数据),测试service业务正确性。依赖可扩展为http,mq,redis等依赖。
引入包
<!-- 1.一般引入 -->
<!‐‐ https://mvnrepository.com/artifact/org.mockito/mockito‐all ‐‐>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito‐all</artifactId>
<version>1.10.19</version>
</dependency>
<!‐‐ https://mvnrepository.com/artifact/junit/junit ‐‐>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!‐‐ https://mvnrepository.com/artifact/org.assertj/assertj‐core ‐‐>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj‐core</artifactId>
<version>3.5.2</version>
</dependency>
<!-- 2.SpringBoot 引入以下即可 -->
<!‐‐ https://mvnrepository.com/artifact/org.springframework.boot/spring‐boot‐starter‐test ‐‐>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐test</artifactId>
<version>1.4.3.RELEASE</version>
</dependency>
Mockito注解
不依赖于Spirng容器
- @InjectMocks:初始化bean,类似于注入。
- @Mock:忽略bean,mock掉的bean操作被假设为成功,可以设置假设成功时返回的数据。
注:@InjectMocks 和 @Mock 的对象,都不能是 interface,必须是可实例化的 Class
- @Before:Junit注解,初始化单元测试的环境及参数。
- @Test:Junit注解,执行单元测试。
初始化mock环境
MockitoAnnotations.initMocks(this)
前方高能,有码区域
// 待测试层bean
@InjectMocks
private MyService myService;
// mock层bean,模拟数据并认为该操作成功
@Mock
private MyDao myDao;
//模拟数据-某个方法的请求参数
private MyRequest myRequest;
//模拟数据-某个方法的响应参数
private MyResponse myResponse;
// 初始化mock环境和数据
@Before
public void initEnv(){
// 初始化mock环境
MockitoAnnotations.initMocks(this);
//初始化请求参数
myRequest = new MyRequest();
myRequest.setUserName("xName");
myRequest.setPassword("xPass");
//初始化响应参数
myResponse = new MyResponse();
myResponse.setMsg("请求成功");
myResponse.setUserId("xUID");
}
// 单元测试
@Test
public void myServiceTest(){
//Mock掉MyDao中的checkUser(MyRequest)方法:当调用 myDao.checkUser(MyRequest)方法时,设置返回myResponse
Mockito.when(myDao.checkUser(Mockito.any(MyRequest.class))).thenReturn(myResponse);
//Mock MyDao中的insertLog(UserLog)方法:当调用 **void** myDao.insertLog(UserLog) 方法时,不做任何事情
Mockito.doNothing().when(myDao).insertLog(Mockito.any(UserLog.class));
//调用被测试方法
//myService.getUser(myRequest)方法中会执行 myDao.getUser(myRequest) 和 myDao.insertLog(userLog) 方法,这两个方法都已经被 Mock了
XxResponse xxResponse = myService.getUser(myRequest);
//断言响应不为空
assertThat(xxResponse).isNotNull();
}
网友评论