mockito 总结

本文详细介绍了Mockito框架的使用,包括mock和spy的区别,@Mock、@Spy、@InjectMocks等注解的生效方式和作用,when/then的两种形式,verify的多种验证方式,Argument matchers的使用,ArgumentCaptor获取参数,自定义mock返回值,以及如何处理难以mock的对象。提供了Mockito测试的重要知识点。
摘要由CSDN通过智能技术生成

1 mock/spy

1.1 mock

List mockedList = mock(LinkedList.class);//可以mock具体类,建议
List interfaceList = mock(List.class);//也可以mock接口

//以下两个等效,并且是默认值
mock(LinkedList.class,Mockito.RETURNS_DEFAULTS);
mock(LinkedList.class,withSettings().defaultAnswer(Mockito.RETURNS_DEFAULTS));
//默认返回一个 SmartNull,可记录更详细的日志信息,mockito 4.0 后为默认
mock(LinkedList.class,Mockito.RETURNS_SMART_NULLS);
//如果返回 null,且不是 final,就返回一个 mock,不建议使用
mock(LinkedList.class,Mockito.RETURNS_MOCKS);
//可以级联调 when(),不建议使用
mock(LinkedList.class,Mockito.RETURNS_DEEP_STUBS);
//默认调用真实方法,这个方法等效于 spy
mock(LinkedList.class,Mockito.CALLS_REAL_METHODS);
//适用于 Builder 模式,一般用不上
mock(LinkedList.class,Mockito.RETURNS_SELF);

1.2 spy

//等效于:mock(ListedList.class,Mockito.CALLS_REAL_METHODS);
spy(LinkedList.class);
List list = new ArrayList();
spy(list);

1.3 @Mock/@Spy/@InjectMocks/@Captor/@MockBean/@SpyBean

1.3.1 如何使这些注解生效
  • 在测试类上使用:@RunWith(MockitoJUnitRunner.class)
  • 在 @Before 中调用:MockitoAnnotations.initMocks(this)
  • 在类中定义:@Rule public MockitoRule mockito = MockitoJUnit.rule();
1.3.2 作用
@Mock/@Spy:相当于 mock/spy 的快捷方式
@InjectMocks:注解的对象相对于 spy 对象,并且可以将 mock/spy 对应的对象自动注入到此对象对应的属性中
@Captor:可以获取 Matcher 实际执行时对应的参数
@MockBean/@SpyBean:相对于 @Mock/@Spy,并且此注释的对象,被加入到 spring 容器中
1.3.3 @InjectMocks 使用
  • https://www.jianshu.com/p/bb705a56f620

2 when/then

  • 有两种形式
    • doXXX().when(),推荐
    • when().doXXX(),不推荐(当调用真实方法时,会先直接when中的方法,这时的真实方法可能有问题,例如没有实现而报错)
    • any():可能造成 NPX
//调用 list.get() 三次以后都返回 third
doReturn("first","second","third").when(list).get(anyInt());
//当使用 matcher 时,所有参数都必须是 matcher 形式
//set(1,anyInt()) 将报错,可写成 set(eq(1),anyInt())
doThrow(new RuntimeException(),new IllegalAccessError()).when(list).set(anyInt(),anyInt())
//调用真实方法
doCallRealMethod().when(list).get(0);    
doNothing().when(list).add(anyInt());
//doAnswer
doAnswer(invocation -> 11).when(list).get(1);
assert 11 == (int)list.get(1);
assert list.get(2) == null;

3 verify

3.1 验证 mock/spy 对象已经执行了什么行为

 //验证 list 执行了 list.add("one")
 verify(list).add("one");
 //验证 list 执行了 list.clear()
 verify(list).clear();

3.2 验证行为执行的次数

//以下两个等效:验证 list.add("once") 执行了 1次
verify(list).add("once"
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值