如何在 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 作为测试依赖项。

不需要额外的依赖。 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 将在线程中保持活动状态(跨多个单元测试)。

Creates a thread-local mock controller for all static methods of the given class or interface. The returned object's MockedStatic.close() method must be called upon completing the test or the mock will remain active on the current thread. Note: We recommend against mocking static methods of classes in the standard library or classes used by custom class loaders used to executed the block with the mocked class. A mock maker might forbid mocking static methods of know classes that are known to cause problems. Also, if a static method is a JVM-intrinsic, it cannot typically be mocked even if not explicitly forbidden. See examples in javadoc for Mockito class Params: classToMock – class or interface of which static mocks should be mocked. defaultAnswer – the default answer when invoking static methods. Returns: mock controller