当前位置:网站首页 > Java教程 > 正文

java mock教程



一、前期准备~

1、准备工作

 

2、入门知识

1)Mockito:简单轻量级的做mocking测试的框架;

2)mock对象:在调试期间用来作为真实对象的替代品;

3)mock测试:在测试过程中,对那些不容易构建的对象用一个虚拟对象来代替测试的方法就叫mock测试;

4)stub:打桩,就是为mock对象的方法指定返回值(可抛出异常);

5)verify:行为验证,验证指定方法调用情况(是否被调用,调用次数等);

3、五分钟入门Demo

 

二、让我们开始学习吧!

1、行为验证

一旦mock对象被创建了,mock对象会记住所有的交互,然后你就可以选择性的验证你感兴趣的交互,验证不通过则抛出异常。

 

2、如何做一些测试桩stub

默认情况下,所有的函数都有返回值。mock函数默认返回的是null,一个空的集合或者一个被对象类型包装的内置类型,例如0、false对应的对象类型为Integer、Boolean;

一旦测试桩函数被调用,该函数将会一致返回固定的值;

对于 static 和 final 方法, Mockito 无法对其 when(…).thenReturn(…) 操作。

 

3、参数匹配器

参数匹配器使验证和测试桩变得更灵活;

为了合理的使用复杂的参数匹配,使用equals()与anyX() 的匹配器会使得测试代码更简洁、简单。有时,会迫使你重构代码以使用equals()匹配或者实现equals()函数来帮助你进行测试;

如果你使用参数匹配器,所有参数都必须由匹配器提供;

支持自定义参数匹配器;

 

4、执行顺序验证

验证执行顺序是非常灵活的-你不需要一个一个的验证所有交互,只需要验证你感兴趣的对象即可;

你可以仅通过那些需要验证顺序的mock对象来创建InOrder对象;

 

5、确保交互(interaction)操作不会执行在mock对象上

一些用户可能会在频繁地使用verifyNoMoreInteractions(),甚至在每个测试函数中都用。但是verifyNoMoreInteractions()并不建议在每个测试函数中都使用;

verifyNoMoreInteractions()在交互测试套件中只是一个便利的验证,它的作用是当你需要验证是否存在冗余调用时;

 

6、使用注解简化mock对象创建

注意!下面这句代码需要在运行测试函数之前被调用,一般放到测试类的基类或者test runner中:

 

也可以使用内置的runner: MockitoJUnitRunner 或者一个rule : MockitoRule;

 

7、监控真实对象(部分mock)

可以为真实对象创建一个监控(spy)对象。当你使用这个spy对象时真实的对象也会也调用,除非它的函数被stub了;

尽量少使用spy对象,使用时也需要小心形式,例如spy对象可以用来处理遗留代码;

stub语法中同样提供了部分mock的方法,可以调用真实的方法;

完全mock:

上文讲的内容是完全mock,即创建的mock对象与真实对象无关,mock对象的方法默认都是基本的实现,返回基本类型。可基于接口、实现类创建mock对象。

部分mock:

所谓部分mock,即创建的mock对象时基于真实对象的,mock对象的方法都是默认使用真实对象的方法,除非stub之后,才会以stub为准。基于实现类创建mock对象,否则在没有stub的情况下,调用真实方法时,会出现异常。

注意点:

Mockito并不会为真实对象代理函数调用,实际上它会拷贝真实对象。因此如果你保留了真实对象并且与之交互,不要期望从监控对象得到正确的结果。 当你在监控对象上调用一个没有被stub的函数时并不会调用真实对象的对应函数,你不会在真实对象上看到任何效果

 

8、@Mock 和 @Spy的使用

@Mock 等价于 Mockito.mock(Object.class);

@Spy 等价于 Mockito.spy(obj);

 

9、ArgumentCaptor(参数捕获器)捕获方法参数进行验证。(可代替参数匹配器使用)

在某些场景中,不光要对方法的返回值和调用进行验证,同时需要验证一系列交互后所传入方法的参数。那么我们可以用参数捕获器来捕获传入方法的参数进行验证,看它是否符合我们的要求。

ArgumentCaptor介绍

通过ArgumentCaptor对象的forClass(Class

ArgumentCaptor的Api

argument.capture() 捕获方法参数

argument.getValue() 获取方法参数值,如果方法进行了多次调用,它将返回最后一个参数值

argument.getAllValues() 方法进行多次调用后,返回多个参数值

 

10、简化 ArgumentCaptor 的创建

 

11、高级特性:自定义验证失败信息

 

12、高级特性:修改没有测试桩的调用的默认返回值

可以指定策略来创建mock对象的返回值。这是一个高级特性,通常来说,你不需要写这样的测试;

它对于遗留系统来说是很有用处的。当你不需要为函数调用打桩时你可以指定一个默认的answer;

 

三、学习了这么多,牛刀小试一下!

测试实体类

 

持久层DAO

 

业务层Service接口

 

业务层Serive实现类

 

现在我们的Service写好了,想要单元测试一下,但是Dao是其他人开发的,目前还没有写好,那我们如何测试呢?

 

根据以上代码我们可以知道,当我们的待测类开发完成而依赖的类的实现还没有开发完成。此时,我们就可以用到我们的Mock测试,模拟我们依赖类的返回值,使我们的待测类与依赖类解耦。这样,我们就可以对我们的待测类进行单元测了。

四、参考文档及进一步学习~

 

行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: ,里面有各种软件测试+开发资料和技术可以一起交流学习哦。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

版权声明


相关文章:

  • java就业教程视频2024-11-19 11:50:00
  • 扫雷简单java教程2024-11-19 11:50:00
  • java教程模拟2024-11-19 11:50:00
  • java教程官网2024-11-19 11:50:00
  • java教程479集2024-11-19 11:50:00
  • java随机抽取教程2024-11-19 11:50:00
  • java代码块教程2024-11-19 11:50:00
  • java教程122024-11-19 11:50:00
  • java教程网课2024-11-19 11:50:00
  • linux java 开发环境搭建教程2024-11-19 11:50:00