Java单元测试之Mockito

这篇具有很好参考价值的文章主要介绍了Java单元测试之Mockito。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Mockito

Mockito是一种Java Mock框架,主要就是用来做Mock测试的,它可以模拟任何Spring管理的Bean、模拟方法的返回值、模拟抛出异常等等,同时也会记录调用这些模拟方法的参数、调用顺序,从而可以校验出这个Mock对象是否有被正确的顺序调用,以及按照期望的参数被调用。

mockito的特别之处?

Mockito的特别之处在于它是一个强大的用于Java开发的模拟测试框架,通过Mockito我们可以创建和配置Mock对象,进而简化有外部依赖的类的测试。Mockito提供了大量的静态方法,用于帮助我们来mock对象,验证行为等等

什么是mockito的stub method?

本人的理解:就是在实际调用代码前,我就规定它返回什么。
一个例子:

// 您可以模拟具体的类,而不仅仅是接口s 
LinkedList mockedList = mock(LinkedList.class); 
// 或者使用Mockito 4.10.0+更简单
// LinkedList mockedList = mock(); 

// 存根(stubbing)在实际执行之前出现
when(mockedList.get(0)).thenReturn("first"); 
// 以下打印“first”
System.out.println(mockedList.get(0)); 
// 下面打印“null”,因为get(999)没有存根
System.out.println(mockedList.get(999));

doThrow

在测试对象发生特定事件时抛出异常。
例1:

PowerMockito
        .doThrow(new NotPermittedException(HttpServletResponse.SC_FORBIDDEN,
                ErrorMsgResourceKeys.auth_accessDenied, "GroupPermissions", null))
        .when(AdminPermissionCheck.class);
AdminPermissionCheck.checkAdminPermission(authorizationsVO, lstPermissions, true);

例2:

@Test
void whenConfigVoidRetunMethodToThrowEx_thenExIsThrown() {
    MyDictionary dictMock = mock(MyDictionary.class);
    doThrow(IllegalStateException.class).when(dictMock)
        .add(anyString(), anyString());
    assertThrows(IllegalStateException.class, () -> {
        dictMock.add("word", "meaning");
    });
}

mockito mock一个返回值为void的函数

最初接触 Mockito 还思考并尝试过如何用它来 mock 返回值为 void 的方法,然而 Google 查找到的一般都会说用 doThrow() 的办法

doThrow(new RuntimeException()).when(mockObject).methodWithVoidReturn();

因为无法使用常规的 when(mockObject.foo()).thenReturn(...) 的方法。

当时我就纳闷,为何我想 mock 一个返回值为 void 的方法,却是在模拟抛出一个异常,现在想来如果一个返回值为 void 的方法,为何要去 mock 这个方法呢?

回想一个我们要 mock 一个方法的意图是什么:

  1. 在特定输入参数的情况下期待需要的输出结果(返回值)
  2. 在方法抛出某种类型异常调用者作出的反应

对于 void 返回值的方法,如果要验证有没有被调用过几次可以在事后用 verify() 方法去断言。所以基本上对于 void 返回值的方法一般可不用去 mock 它,只需用 verify() 去验证,或者就是像前面一样模拟出现异常时的情况。

解决单元测试Mockito模拟方法内new对象的问题

解决单元测试Mockito模拟方法内new对象的问题_mockito new_半斤米粉闯天下的博客-CSDN博客
记PowerMockito whenNew的一个坑_Brain_L的博客-CSDN博客
@PrepareForTest后面应该加上被测试的类,而不是要whenNew的类,被这个坑过两次了,特此记录下。

doReturn().when()与when().thenReturn()

java - doReturn().when()与when().thenReturn() - 成长之路 - SegmentFault 思否
doReturn().when()是无副作用的。
when().thenReturn()是有副作用的。
如果有时候报错missing thenReturn等问题,可以把(对象.方法)改为.(对象).方法

mockito怎么mock final修饰的类?

如果使用Mockito.mock(Gson.class),会报错:

Mockito cannot mock/spy because : - final class

这是因为低版本的mockito是不能mock final类的。

解决方案:Mockito不能mock final类的解决办法_南瓜慢说的博客-CSDN博客

改变mockito的版本,修改maven依赖如下:

<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-inline</artifactId>
  <version>3.3.3</version>
</dependency>

重跑测试,问题解决!

然而,万一随意变动依赖导致其他test失效就得不偿失了,因此最好从业务逻辑上对代码进行改造,这里我们涉及的代码为:

Gson gson = new Gson();
String file = (String) gson.fromJson(result, Map.class).get("data");

Gson是final修饰的类,我们要调用它的fromJson方法,其实我们可以构造一个json格式的字符串result:

{data:logs}

然后fromJson就能正常调用了。文章来源地址https://www.toymoban.com/news/detail-647858.html

到了这里,关于Java单元测试之Mockito的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mock写单元测试和查数据库的单元测试

    一:mock方式 在测试类上添加注解 将需要测试的类bean添加进来,该类中的其他bean也添加进来 给被测试类中用到的参数、返回值类创建对象 创建BeforeEach和AfterEach方法,在BeforeEach方法中给参数,返回值设置值 然后在test方法中设置被测试的方法 二:可以检测dao层sql的单元测试

    2024年02月15日
    浏览(34)
  • spring boot 单元测试JUnit5使用Mockito模拟Mock数据调用

    spring boot 单元测试JUnit5使用Mockito模拟Mock数据调用 好大一批新用法,大家静下心来好好看看吧 1. spring boot 使用 Mockito.when().thenReturn()模拟返回值 Mockito 是一种 Java mock 框架,他主要就是用来做 mock 测试的,他可以模拟任何 Spring 管理的 bean、模拟方法的返回值、模拟抛出异常…

    2024年02月15日
    浏览(29)
  • 简化Java单元测试数据

    EasyModeling 是我在2021年圣诞假期期间开发的一个 Java 注解处理器,采用 Apache-2.0 开源协议。它可以帮助 Java 单元测试的编写者快速构造用于测试的数据模型实例,简化 Java 项目在单元测试中准备测试数据的工作,在提高编写效率的同时,使单元测试更加整洁易读。经过一年的

    2024年02月15日
    浏览(17)
  • JAVA测试类注解以及Mock测试

    我们在项目中,经常要编写一个测试类XXXXXTest,其中一般会用到以下注解: 1. @RunWith(PowerMockRunner.class) JUnit将会调用@RunWith中指定的测试执行类而不是JUnit默认的执行类。 2.@PrepareForTest({ExampleTestServer.class})         2.1 当使用Mockito.whenNew方法时(下面的Mock测试),必须加此注解

    2023年04月26日
    浏览(15)
  • java 单元测试创建到测试(直接连接数据库方法)

    一.JUnit5常用注解 @Before注解用于在测试方法执行之前执行一次,可以用来设置测试环境、准备数据等。 @After注解用于在测试方法执行之后执行一次,可以用来清理测试环境、处理异常等。 @Test 表示方法是测试方法。他的职责非常单一不能生命任何属性,拓展的测试将会有

    2024年02月06日
    浏览(27)
  • java单元测试(二)H2数据库篇

    H2 数据库是一个用 Java 开发的嵌入式(内存级别)数据库,它本身只是一个类库,也就是只有一个 jar 文件,可以直接嵌入到项目中。 H2数据库又被称为内存数据库,因为它支持在内存中创建数据库。 为什么测试数据库CRUD 对于Spring项目,特别是测试Service层或者dao层的代码时。需要验

    2024年02月06日
    浏览(24)
  • Service层代码单元测试以及单元测试如何Mock

    接着上一篇文章:单元测试入门篇,本篇文章作为单元测试的进阶篇,主要介绍如何对Springboot Service层代码做单元测试,以及单元测试中涉及外调服务时,如何通过Mock完成测试。 现在项目都流行前后端代码分离,后端使用springboot框架,在service层编写接口代码实现逻辑。假设

    2023年04月08日
    浏览(24)
  • 单元测试与Mock

    作者:一笑钦陈 邮箱:xianqin_chen@163.com 你好,我是一笑钦陈,《零零后程序员成长之路》作者,一线互联网 Java 工程师。很高兴你阅读我的博客,让我们共同成长进步! 提醒:在接下来您对本博客的阅读中,如果遇到一些内容、图稿、代码等中的勘误都可以通过邮件进行反

    2024年02月08日
    浏览(36)
  • 单元测试junit+mock

    单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。至于“单元”的大小或范围,并没有一个明确的标准,“单元”可以是一个方法、类、功能模块或者子系统。 单元测试通常和白盒测试联系到一起 ,如果单从概念上来讲两者是有区别的,不过我们通

    2024年02月08日
    浏览(40)
  • Testify Mock 单元测试

    Testify 提供了单测方便的断言能力,这里的断言是将对代码实际返回的断言,代码的实际输出和预期是否一致。下面是 gin-gonic/gin 代码库的单测代码,Testify 还提供了很多其他的方法: 单元测试中也会存在不稳定的代码,我们的入参虽然保持不变,但每次单测的结果可能会发

    2024年02月03日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包