单元测试之Mockito
第一章 JavaCoder Springboot 继承 Mockito 单元测试
@单元测试之Mockito
前言
随着好多公司的要求程序员都要强制单元测试,主流测单元测试有3个,本文就介绍了单元测试基础内容主要是 Mockito。
一、Mockito是什么?
mockito 是一个单元测试模拟框架,可以让你写出优雅、简洁的单元测试代码。 Mockito 采用了模拟技术,模拟了一些在应用中依赖的复杂对象,从而把测试对象 和依赖对象隔离开来。以上内容摘自《Java工程师必读手册》电子书,点击https://developer.aliyun.com/ebook/download/7780 可下载完整版
二、使用步骤
1.引入库
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.7.19</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
2. 测试代码如下
package com.ty.tymockdemo;
import com.ty.tymockdemo.controller.TyController;
import com.ty.tymockdemo.service.impl.TyServiceImpl;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.List;
import static org.mockito.Mockito.mock;
@RunWith(MockitoJUnitRunner.class)
public class TyControllerTest {
@InjectMocks
TyController tyController = new TyController();
@Mock
TyServiceImpl tyService;
@Before
public void initMocks() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testTest() {
List<String> res = mock(List.class);
res.add("1");
Mockito.when(tyService.find()).thenReturn(res);
List<String> test = tyController.test();
Assert.assertEquals(res.size(), test.size());
}
}
package com.ty.tymockdemo;
import com.ty.tymockdemo.mapper.TyMapper;
import com.ty.tymockdemo.service.impl.OderServiceImpl;
import com.ty.tymockdemo.service.impl.TyServiceImpl;
import org.junit.Assume;
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 static org.hamcrest.Matchers.is;
import static org.mockito.Mockito.mock;
@RunWith(MockitoJUnitRunner.Silent.class)
public class TyServiceImplTest {
@InjectMocks
TyServiceImpl tyService = new TyServiceImpl();
@Mock
OderServiceImpl oderService ;
@Mock
TyMapper tyMapper;
@Before
public void initMocks() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testFind() {
List<String> tafRes = mock(List.class);
List<String> res = mock(List.class);
Mockito.when(oderService.findByOrderId("orderId")).thenReturn(tafRes);
Mockito.when(tyMapper.find()).thenReturn(res);
List<String> strings = tyService.find();
Assume.assumeThat(res.size(), is(strings.size()));
}
}
2. 常见问题说明
2.1 @Mock 注入为null 问题
- 导出的包需要是 import org.junit.Test; 否则会报错导入的对象是 null
- 需要提前准备好环境
import org.junit.Test;
@Before
public void initMocks() {
MockitoAnnotations.initMocks(this);
}
3. Suite 套件
package com.ty.tymockdemo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({
TyControllerTest.class,
TyServiceImplTest.class})
public class AllTest {
@Test
public void test() {
}
}
总结
优点
①模拟资源
②隔离系统或模块
③并行开发
④TDD模式开发
⑤快速演示
⑥覆盖度广
缺点
①需要很多硬编码。硬编码很多不同的case数据,因为测试覆盖度广
②侵入性强。好用的spock框架,很难和spring风格的单元测试结合起来。
③应对需求不足。需求变化时,单元测试和case难以维护。
④学习成本高
以上就是今天要讲的内容,本文仅仅简单介绍了Mockito的使用,而Mockito提供了强大的功能 .(由于今天是第一天写单元测试 所以记录下)
Mockito 的官网地址 :
https://site.mockito.org/
demo 的 GitHub 地址 :
git@github.com:TiloY/ty-mock-demo.git