欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > Junit单元测试笔记

Junit单元测试笔记

2025/9/18 6:24:17 来源:https://blog.csdn.net/weixin_36152775/article/details/141527729  浏览:    关键词:Junit单元测试笔记

常用mock类框架

在软件测试和开发过程中,Mock框架扮演着至关重要的角色,它们允许开发者模拟对象的行为,以便在不需要实际依赖的情况下进行测试。以下是一些常用的Mock框架:

  1. Mockito
  2. PowerMock
  3. EasyMock
  4. JMock
  5. Spock

初始化mock/spy对象的两种方式

  1. Mockito.mock(Class),Mockito.spy(Class)
  2. 注解方式:@Mock, @Spay

image-20240825121219369

image-20240825121455495

Mock对象默认返回值

mock对象默认不会调用真实方法,直接返回mock对象的默认值:

  • int

  • null(UserVo)

  • 空集合(List)

参数匹配

ArgumentMatcher.any拦截任意类型的参数

除了any,还有anyXXX(anyLong,anyString…)

指定返回值

  1. doReturn(returnObj).when(mockObject).someMethod(someArg);
  2. when(mockObject.someMethod(someArg)).thenReturn(returnObj);

void返回值方法插桩

doNothing().when(mockObject).someMethod(someArg);

插桩的两种方式

  1. when(obj.someMethod()).thenXxx();其中obj可以是mock对象
  2. doXxx().when(obj).someMethod();其中obj可以是mock/spy对象

注意:

spy对象在没有插桩时是调用真实方法的,写在when…then中会导致先执行一次原方法,达不到mock的目的。

需使用doXxx().when().someMethod()的方式。

如果用到了spy,推荐使用第二种方式,或者不管是Mock还是Spy都用第二种方式。

image-20240825103520453

抛出异常

  1. doThrow(SomeException.class).when(mockObj).someMethod();
  2. when(mockObj.someMethod()).thenThrow(SomeExcetion.class);

多次插桩

when(mockObj.someMethod()).thenReturn(returnObj1).thenReturn(returnObj2).then(returnObj3);

用这种流式的写法,在下面调用这个mock对象的对应的方法时会依次返回设置的返回值。

或者简写为:

when(mockObj.someMethod()).thenReturn(returnObj1,returnObj2,returnObj3);

image-20240825104643190

实现指定逻辑的插桩

可以使用thenAnswer实现指定逻辑的插桩,示例如下,个人觉得这种场景比较少。

image-20240825105101260

执行真正的原始方法

  • mock对象默认不执行原始方法。

​ 用when(mockObj.someMethod()).thenCallRealMethod()的方式执行原始方法。

  • spy对象默认就会调用真实的方法

  • 可以不让spy对象调用真实方法

    doReturn(returnObj).when(spyObj).someMethod();//指定了返回值就不用调用真实的方法了

示例:

image-20240825105637211

verify的使用

  • 验证调用过1次或几次
  • verify(mockObj).someMethod();

验证调用过1次这个方法

  • verify(mockObj, times(1)).someMethod();

此时与上面的等价,但是可以修改times()的参数值,写几就代表验证调用几次。

  • 验证没有调用过

verify(mockObj, never()).someMethod();

或者

verify(mockObj, times(0)).someMethod();

  • 验证最少或最多调用多少次
  • verify(mockObj, atLeast(1)).someMethod();

  • verify(mockObj, atMost(1)).someMethod();

image-20240825110110415

@InjectMocks注解的使用

  • 被@InjectMocks标注的属性必须是实现类,因为mockito会创建对应的实例对象

  • 默认创建的对象是未经过mockito处理的普通对象,因此常配合@Spy注解使其变成默认调用真实方法的mock对象

  • 被@InjectMocks标注的属性需要用到mock/spy对象,mockito会自动使用当前类里的mock或spy成员按类型或名称注入

    原理:构造器注入、setter注入、字段反射注入

image-20240825112122390

注意:

@InjectMocks不能注入父类的属性

几种常用的断言工具

image-20240825112812211

示例:

image-20240825112854906

自动生成单元测试类的插件

idea插件:squaretest插件

image-20240825120110131
在这里插入图片描述

image-20240825120539186

选择一个生成的模板:

image-20240825120712923

静态方法的Mock

image-20240824171127213

mock静态类的话需要释放资源,如果不释放资源的话,后面还有对这个类进行mock操作会报错

image-20240824175517979

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词