维基百科对单元测试的定义: 单元测试(英语:Unit Testing)又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工做。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。 单元测试的目标是隔离程序部件并证实这些单个部件是正确的。
Mock脱离数据库 + 不启动Spring + 优化测试速度 + 不引入项目组件数据库
单元测试不该该依赖数据,依赖外部服务或组件等,会对其余数据产生影响的状况。启动Spring容器,通常比较慢,可能会启动消息监听消费消息,定时任务的执行等,对数据产生影响。编程
Mock测试就是在测试过程当中,对那些当前测试不关心的,不容易构建的对象,用一个虚拟对象来代替测试的情形。网络
说白了:就是解耦(虚拟化)要测试的目标方法中调用的其它方法,例如:Service的方法调用Mapper类的方法,这时候就要把Mapper类Mock掉(产生一个虚拟对象),这样咱们能够自由的控制这个Mapper类中的方法,让它们返回想要的结果、抛出指定异常、验证方法的调用次数等等。app
减小单元测试对外部的依赖和反作用,提升单元测试效率函数
若是使用@Mock注解, 必须去触发所标注对象的建立. 可使用 MockitoRule来实现. 它调用了静态方法MockitoAnnotations.initMocks(this) 去初始化这个被注解标注的字段.或者也可使用@RunWith(MockitoJUnitRunner.class).单元测试
“when thenReturn”和”when thenThrow”
模拟对象能够根据传入方法中的参数来返回不一样的值, when(….).thenReturn(….)方法是用来根据特定的参数来返回特定的值.测试
咱们也可使用像 anyString 或者 anyInt anyLong any 这样的方法来定义某个依赖数据类型的方法返回特定的值.优化
“doReturn when” 和 “doThrow when”
doReturn(…).when(…)的方法调用和when(….).thenReturn(….)相似.对于调用过程当中抛出的异常很是有用.而doThrow则也是它的一个变体.this
@Mock:对函数的调用均执行mock(即虚假函数),不执行真正部分。设计
@Spy:对函数的调用均执行真正部分。
@InjectMocks:建立一个实例,简单的说是这个Mock能够调用真实代码的方法,使用@Mock(或@Spy)注解建立的mock将被注入到用该实例中。
Mockito中的Mock和Spy均可用于拦截那些还没有实现或不指望被真实调用的对象和方法,并为其设置自定义行为。两者的区别在于Mock不真实调用,Spy会真实调用。
@MockBean: 功能同 @Mock, 只是会将实例放入 Spring 容器管理
@SpyBean: 功能同 @Spy, 只是会将实例放入 Spring 容器管理
// 不使用 @SpringBootTest(classes = Application.class) @RunWith(SpringRunner.class) public class ExamAnswerComponentTest { // 建立一个实例,会注入Mock变量 @InjectMocks private ExamAnswerComponent examAnswerComponent = new ExamAnswerComponentImpl(); // 相关操做会被Mock掉 @Mock private ExamAnswerCacheObjectiveDAO examAnswerCacheObjectiveDAO; @Before public void setUp() { // 初始化Mock MockitoAnnotations.initMocks(this); // given...willReturn 指定方法参数,模拟返回值 given(examAnswerCacheObjectiveDAO.selectByBizIdAndPaperAndQuestion(any(), any(), any())) .willReturn(new ExamAnswerCacheObjectivePO()); given(examAnswerCacheObjectiveDAO.insert(any())).willReturn(1); given(examAnswerCacheObjectiveDAO.updateUserAnswerById(any(), any())).willReturn(1); } @Test public void saveOrUpdateAnswerCacheObjective() { ExamAnswerCacheObjectivePO po = new ExamAnswerCacheObjectivePO(); po.setBizId(100000015L); po.setBizType(9); po.setUserAnswer("A"); po.setGroupPaperId(1000320L); po.setQuestionId(1000042L); po.setQuestionType(1); int affect = examAnswerComponent.saveOrUpdateAnswerCacheObjective(po); System.out.println("affect = " + affect); Assert.assertTrue(affect > 0); } }