Mockito无法模拟静态方法

3

我不知道我的代码哪里出了问题,我的所有静态方法都无法被Mockito模拟...

我已经检查了几个小时,看起来我的代码没有任何问题。

以下是依赖关系:

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

这里是静态方法:
public class FakeTokenUtil {
    public static String getToken(){
        return "123123123123";
    }
}

这是测试类:

@RunWith(MockitoJUnitRunner.class)
public class TokenTest {
    @Test
    public void mockStatic() {
        MockedStatic<FakeTokenUtil> mock=Mockito.mockStatic(FakeTokenUtil.class);
        mock.when(FakeTokenUtil::getToken).thenReturn("666666");
        System.out.println(FakeTokenUtil.getToken());
    }
}

运行测试后,我得到了这个异常:

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.

    at com.test.myapp.service.TokenTest.mockStatic(TokenTest.java:13)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.mockito.internal.runners.DefaultInternalRunner$1$1.evaluate(DefaultInternalRunner.java:55)
    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
    at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
    at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
    at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
    at org.mockito.internal.runners.DefaultInternalRunner$1.run(DefaultInternalRunner.java:100)
    at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:107)
    at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:41)
    at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:163)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)


1
您可以通过将“mockito-inline”构件放置在当前使用“mockito-core”的位置来简单启用此模拟模式。请注意:只需使用mockito-inline,不要使用mockito-core。 - Gimby
1
@Gimby,我尝试用mockito-inline替换mockito-core,但是找不到MockedStatic方法。 - william
1个回答

8

来自文档:

尝试添加一个文件 src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker,其中只有一行内容。

mock-maker-inline

虽然这种特性会稍微降低性能,但我通常尽量避免这种模拟。也许你也应该重新考虑你的代码。如果它是一个简单和可预测的实用方法,则无需为其编写测试模拟。如果它是另一个组件的依赖项,则应将其作为实例方法。


但是如果我不模拟这个静态方法,我的代码测试将会失败... 我只想在调用静态方法时给它一个默认的测试值。 - william

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接