我可以在带有 JUnit5 的 Quarkus 中使用 PowerMockito 吗?

Can I use PowerMockito in Quarkus with JUnit5?

我目前正在构建一个 Quarkus 应用程序,我正在使用 JUnit5 进行单元测试。目前我没有其他选择,然后使用 PowerMockito 模拟我的静态函数,但我似乎无法在我的 Quarkus 项目中找到它的依赖项。

有谁知道在带有 JUnit5 的 PowerMockito 的 Quarkus 应用程序中应该使用哪些最佳依赖项?

我想您不需要 PowerMockito,只需要模拟静态方法的能力。自 2.7.x(2017 年发布)以来,Mockito 社区制作了一个名为 mockito-inline 的实验性库,用于模拟静态方法或最终 classes。一些功能(例如静态方法模拟)已经合并到 mockito-core 中。 另外 Quarkus 有 Mockito 的扩展。

这是一个工作示例

pom.xml

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <groupId>io.github.zforgo</groupId>
    <artifactId>quarkus-mockito-static</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <compiler-plugin.version>3.8.1</compiler-plugin.version>
        <maven.compiler.release>11</maven.compiler.release>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
        <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
        <quarkus.platform.version>2.6.1.Final</quarkus.platform.version>
        <surefire-plugin.version>3.0.0-M5</surefire-plugin.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>${quarkus.platform.group-id}</groupId>
                <artifactId>${quarkus.platform.artifact-id}</artifactId>
                <version>${quarkus.platform.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-arc</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-junit5</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-junit5-mockito</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>${quarkus.platform.group-id}</groupId>
                <artifactId>quarkus-maven-plugin</artifactId>
                <version>${quarkus.platform.version}</version>
                <extensions>true</extensions>
                <executions>
                    <execution>
                        <goals>
                            <goal>build</goal>
                            <goal>generate-code</goal>
                            <goal>generate-code-tests</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${compiler-plugin.version}</version>
                <configuration>
                    <compilerArgs>
                        <arg>-parameters</arg>
                    </compilerArgs>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${surefire-plugin.version}</version>
                <configuration>
                    <systemPropertyVariables>
                        <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
                        <maven.home>${maven.home}</maven.home>
                    </systemPropertyVariables>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

一些实用程序 class 使用静态方法

package io.github.zforgo;

public class SomeStaticClass {

    public static String getSome() {
        return "foo";
    }
}

测试class

package io.github.zforgo;

import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import static org.junit.jupiter.api.Assertions.assertEquals;

@QuarkusTest
public class SomeStaticClassTest {

    @Test
    void nonMocked() {
        assertEquals("foo", SomeStaticClass.getSome(), "Something went wrong");
    }

    @Test
    void mocked() {
        // try-with-resources is recommended in case of scoped (temporary) mocking 
        try (var mocked = Mockito.mockStatic(SomeStaticClass.class)) {
            mocked.when(SomeStaticClass::getSome).thenReturn("bar");
            assertEquals("bar", SomeStaticClass.getSome(), "Something went wrong");
        }
    }
}