首页 > 其他分享 >关于如何正确在测试用例中mock静态方法的问题

关于如何正确在测试用例中mock静态方法的问题

时间:2024-12-19 16:30:03浏览次数:6  
标签:静态方法 Mockito 测试用例 报错 mock 模拟

文章目录

关于如何正确在测试用例中mock 静态方法的问题

情况一:希望在测试用例中直接执行静态方法的逻辑

    // 比较简单,使用注解@Spy即可
	@Spy
	private DateUtils dateUtils;

情况二:不希望在测试用例中执行静态方法的逻辑

而是希望通过mock来模拟执行,比如静态方法中是关于某些客户端的操作,直接mock就行了。

插桩方法

 try (MockedStatic<FeiShuUtil> feiShuUtilMockedStatic = Mockito.mockStatic(FeiShuUtil.class)) {
            feiShuUtilMockedStatic.when(() -> FeiShuUtil.getFeiShuUsersByPhones(any(), any(), any())).thenReturn(List.of(new UserContactInfo()));
            // Act
            UrgentMessageSendDto sendDto = getUrgentMessageSendDto();
            ApiResultDto<String> result = messageSendService.sendUrgentPhoneMessage(sendDto);
            // Assert
            assertThat(result.getEr()).isEqualTo(ApiErrorCode.SERVER_ERROR.getCode());
        } // 这里静态模拟会被自动取消注册

坑1: 报错SubclassByteBuddyMockMaker

 			org.mockito.exceptions.base.MockitoException: 
            The used MockMaker SubclassByteBuddyMockMaker does not support the creation of static mocks
            
            Mockito's inline mock maker supports static mocks based on the Instrumentation API.
            You can simply enable this mock mode, by placing the 'mockito-inline' artifact where you are currently using 'mockito-core'.
            Note that Mockito's inline mock maker is not supported on Android.

原因与解决方案

原因:意味着当前使用的 Mockito 版本和配置不支持静态方法的模拟。这通常发生在使用较旧版本的 Mockito 或者没有正确设置以启用对静态方法模拟的支持时。

解决方法:添加依赖

   		<dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-inline</artifactId>
            <version>3.12.4</version>
            <scope>test</scope>
        </dependency>

坑2:报错 the existing static mock registration must be deregistered

在执行单次测试用例的时候没有报错,但是一到集成测试,会测试一系列的测试用例,会有报错:

org.mockito.exceptions.base.MockitoException: 
For com.nimbus.messagecenter.util.FeiShuUtil, static mocking is already registered in the current thread

To create a new mock, the existing static mock registration must be deregistered

原因与解决方案

原因:插桩方法不对,,写法如下,没有通过try包起来

这个错误信息表明在当前线程中已经注册了一个针对 FeiShuUtil 类的静态方法的 Mockito 模拟(mock),并且您正尝试再次创建一个新的模拟,这违反了 Mockito 的规则。Mockito 不允许在同一线程中多次注册对同一类的静态方法的模拟。

当需要模拟静态方法时,通常会使用 Mockito.mockStatic() 方法来创建一个静态模拟。该调用返回一个 try-with-resources 语句或类似的作用域管理器,它会在作用域结束时自动取消注册静态模拟。如果您没有正确地关闭这个作用域,或者在一个测试方法中多次尝试创建静态模拟,就会遇到上述错误。

	MockedStatic<FeiShuUtil> feiShuUtilMockedStatic = Mockito.mockStatic(FeiShuUtil.class)
	feiShuUtilMockedStatic.when(() -> FeiShuUtil.getFeiShuUsersByPhones(any(), any(), any())).thenReturn(List.of(new UserContactInfo()));
	// Act
	UrgentMessageSendDto sendDto = getUrgentMessageSendDto();
	ApiResultDto<String> result = messageSendService.sendUrgentPhoneMessage(sendDto);
	// Assert
	assertThat(result.getEr()).isEqualTo(ApiErrorCode.SERVER_ERROR.getCode());
}

标签:静态方法,Mockito,测试用例,报错,mock,模拟
From: https://blog.csdn.net/qq_21880261/article/details/144588588

相关文章

  • 单元测试中设计测试用例的依据
    一、需求规格说明书功能需求描述需求规格说明书详细地阐述了软件系统应该具备的功能。例如,对于一个计算器软件的加法功能,说明书会明确指出用户输入两个数字后,系统能够正确计算它们的和并输出结果。测试人员就可以根据这个描述设计测试用例,如输入整数相加(如2+3)、小数相加(如2.......
  • ChatGPT生成测试用例的最佳实践(三)
        还记得在第1章,我们利用ChatGPT生成的业务用例吗?这种业务用例生成方式其实和场景法用例设计十分相似,我们是不是也可以直接将业务用例输入ChatGPT,让它输出测试用例呢?笔者输入相关提示词让其补充以需求规格说明书中的业务用例为依据的测试用例,ChatGPT输出如图3-5所示。......
  • ChatGPT生成测试用例的最佳实践(二)
           这种测试用例还不够直观,能不能让其以表格的形式显示呢?笔者输入“请以表格形式展示,谢谢。”提示词,ChatGPT输出的部分内容如图3-3所示。 图3-3 ChatGPT输出的部分内容      以下为ChatGPT生成的关于百度关键字搜索的测试用例集(以表格形式组织)。ChatG......
  • 如何在 Spring Boot 应用程序中使用 WireMock 模拟外部 rest api 调用进行测试
    模拟外部API调用是集成或端到端测试中的常见做法,因为它允许开发人员将他们的代码与外部隔离。如果我们使用付费API并希望避免在测试时进行调用以节省资金,这也会有所帮助。有两种方法可以模拟外部API使用Mockito使用WireMock在集成测试和端到端测试中,我更喜欢使用Wir......
  • vue2 配置 mock.js 模拟后端数据
    安装mockj首先确保你有一个vue2项目,如果没有,可以用VueCLI创建一个:vuecreatevue-mock-demo开始安装Mock.jsnpminstallmockjs--save-dev创建Mock配置文件在项目的src目录下新建一个文件夹mock,并在其中创建index.js文件,用于编写模拟接口。例如(src/mock......
  • ChatGPT生成测试用例的最佳实践(一)
           前面介绍的案例主要展示了ChatGPT在功能、安全和性能测试用例生成方面的应用和成果。通过ChatGPT生成测试用例,测试团队不仅可以提升工作效率,还可以加快测试工作的速度,尽早发现被测系统中的问题。问题及早发现有助于提高软件的质量和用户满意度。ChatGPT在功能、......
  • JAVA中 普通方法/变量,静态方法/变量,之间的相互调用
    publicclassMyapp{//普通变量inta=1;//静态变量staticStringstr="字符串";//普通方法publicvoidMethod1(){//普通方法中可以使用普通属性/方法,静态属性/静态方法均是直接调用即可System.out.println(a);S......
  • ChatGPT自动生成功能测试用例的步骤
    在上一节,我们一起探讨了ChatGPT在功能测试用例生成方面的优势。接下来,我们将探讨ChatGPT自动生成功能测试用例的步骤。1)   问题定义:让ChatGPT自动生成功能测试用例的第一步是清晰地定义要测试的功能或特性和提供足够的上下文信息。提供足够的上下文信息对于ChatGPT生成......
  • ChatGPT在功能测试用例生成方面的优势
    功能测试是软件测试的非常重要的分类,所有软件系统都要保证功能的正确性,而测试用例则是功能测试的重中之重。测试用例的编写是测试人员必须认真面对的一件耗时费力、枯燥乏味的工作。如何才能快速高效地编写测试用例且这些用例能够覆盖功能需求,一直是软件测试领域的一个重要挑......
  • 测试用例方法
    1.等价类:定义:指某个输入域的集合,在集合中各个输入的条件都是等效的。有效等价类:对程序规格说明有意义的、合理的输入数据无效等价类:对程序规格说明无意义的、不合理的输入数据2.边界点定义:(1)边界上的点(2)离点:离上点最近的点(即上点左右两边最邻近的点)(3)内点:在域范围内的点:3......