PowerMock – 常用类与接口

2017年12月4日 0 条评论 1k 次阅读 0 人点赞

常用类与接口

Answer

配置mock预期结果的通用接口。Answer接口指定了与mock执行交互时返回的预期结果,适用于根据不同参数返回不同值。

Book

BookDao

BookService

BookServiceTestWithPowerMock

虽然可以顺利执行测试,但是进行多次调用时需要录制多次行为以便后续回放,这其实是很不优雅的。为此Power Mock提供了一个Answer接口用来承接不同的属于同时根据实际情况返回不同结果从而实现一次行为录制产出多个不同的结果。

BookServiceTestWithPowerMock - upgrade

answer方法接收到的参数类型为InvocationOnMock,进入到该接口的定义中

ArgumentMatcher

参数匹配器,适用于根据不同参数返回不同值。关于Book,BookDao和BookService我们沿用Answer接口测试时候的类即可,重点关注下参数匹配器的使用。

BookServiceTestWithPowerMock

进行多次调用时与未使用Answer接口前的示例一样,需要录制多次行为以便后续回放,频繁录制行为是非常繁琐的事情同时代码也不会很美观,为此我们可以选择使用org.mockito.ArgumentMatcher进行扩展。

BookServiceTestWithPowerMock - upgrade

Verify

使用verify(mock).someMethod(…)来验证方法的调用,为了增加测试的可维护性,官方不推荐我们过于频繁的在每个测试方法中都使用它,如果要验证Mock 对象的某个方法调用次数,则需给verify 方法传入相关的验证参数,它的调用接口是verify(T mock, VerificationMode mode) 。Verify支持多种类型的验证:
  • 验证someMethod()是否能在指定的100毫秒中执行完毕,verify(mock, timeout(100)).someMethod();
  • 在超时验证的同时可进行调用次数验证,默认次数为1,verify(mock, timeout(100).times(1)).someMethod();
  • 给定的时间内完成执行次数,verify(mock, timeout(100).times(2)).someMethod();
  • 给定的时间内至少执行两次,verify(mock, timeout(100).atLeast(2)).someMethod();
  • timeout也支持自定义的验证模式,verify(mock, new Timeout(100,yourOwnVerificationMode)).someMethod();

Book

BookDao

BookService

通过Service层可以看到,saveOrUpdate其实是根据获取到的数据条数来判断是更新数据库操作还是插入操作,在count()返回值确定的情况下if语句只会执行一个方法也就是说我们可以确定哪个方法肯定执行了哪个方法肯定没有执行。

BookServiceTestWithPowerMock

Spy

Mock 不是真实的对象,它只是用类型的 class 创建了一个虚拟对象,并可以设置对象行为。Spy 是一个真实的对象,但它可以设置对象行为。

使用Spy生成的类,所有方法都是真实方法,返回值都是和真实方法一样的,spy对象在未指定处理规则时则会直接调用真实方法。

BookService

BookServiceTestWithPowerMock

至此Power Mock概念,局部变量,静态方法,final修饰方法,构造方法,常用接口等常用操作已经介绍完毕,希望在日后Unit Test中可以广泛使用使得UT整洁,功能测试覆盖全面一些 :evil:

 

勇敢,和生活的艰难无关。

文章评论(0)