繁体   English   中英

如何在 Spring-Boot 中使用 mockito-inline?

[英]How to use mockito-inline with Spring-Boot?

上下文:我们使用的是 Junit 5,Spring-Boot 2.6.3 Spring-Boot 依赖于 mockito-core

问题我希望为静态方法创建一个模拟。 Mockito 提供了一个库(mockito-inline),它允许模拟静态方法,但是,它在 mockito-core 不直接依赖时工作。 Mockito-inline 在需要时下载兼容的 mockito-core。
(参考: https ://frontbackend.com/java/how-to-mock-static-methods-with-mockito)

可能的解决方案

  1. 从 spring-boot 中删除 mockito-core - 请通过建议如何完成它来提供帮助,而不影响 Mockito-inline 添加的相同依赖项?
  2. 我的理解有问题 - 如果是这种情况,请帮助我更好地理解它,可能有一个使用 Mockito 和 Spring-boot 来模拟静态方法的例子

mockito-corespring-boot-starter-test 只需将其排除并添加mockito-inline作为测试依赖项。

根据Github上的文档。

它可以通过 mockito 扩展机制通过创建包含一行的文件src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker

mock-maker-inline

不需要额外的依赖。 Mockito.mockStatic 是 mockito 核心的一部分。 据我所知,您只需在测试资源根目录的“mockito-extensions”文件夹中添加文件“org.mockito.plugins.MockMaker”。

但是,如果您真的想从 spring 中排除 mockito 的依赖项,您可以通过在 pom.xml 依赖项中添加排除项来实现。 如何显式排除库的依赖项的示例如下所示。

    <dependency>
        <groupId>jcifs</groupId>
        <artifactId>jcifs</artifactId>
        <version>1.3.17</version>
        <exclusions>
            <exclusion>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
            </exclusion>
        </exclusions>
   </dependency>

使用 mockStatic 也要非常小心。 最后总是调用 close 否则 staticMock 将在线程中保持活动状态(跨多个单元测试)。

为给定类或接口的所有静态方法创建线程本地模拟控制器。 返回对象的 MockedStatic.close() 方法必须在完成测试后调用,否则模拟将在当前线程上保持活动状态。 注意:我们建议不要模拟标准库中类的静态方法或自定义类加载器使用的类,这些类加载器用于使用模拟类执行块。 模拟制造商可能会禁止模拟已知会导致问题的已知类的静态方法。 此外,如果静态方法是 JVM 固有的,即使没有明确禁止,它通常也不能被模拟。 有关 Mockito 类参数,请参阅 javadoc 中的示例: classToMock – 应模拟静态模拟的类或接口。 defaultAnswer – 调用静态方法时的默认答案。 返回:模拟控制器

您实际上并不需要删除mockito-core依赖项,因为mockito-inline无论如何都依赖于它

只需将mockito-inline依赖项添加到您的 POM 文件就足够了:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM