【问题标题】:Mockito cannot mock a static methodMockito 无法模拟静态方法
【发布时间】:2022-01-11 09:23:08
【问题描述】:

我不知道我的代码有什么问题,我的静态方法都不能被 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)

【问题讨论】:

  • “您可以简单地启用此模拟模式,只需将 'mockito-inline' 工件放置在您当前使用 'mockito-core' 的位置。” - 阅读:仅使用mockito-inline,不要使用 mockito-core。
  • @Gimby 我试图用mockito-inline 替换mockito-core,但我找不到MockedStatic 方法。

标签: java spring-boot mockito


【解决方案1】:

From the doc:

尝试用一行添加一个文件 src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker

mock-maker-inline

不过,此功能会带来轻微的性能成本。我通常会尽量避免这种嘲笑。也许你也应该重新考虑你的代码。如果它是一种简单且可预测的实用方法,则无需模拟它进行测试。如果它是对另一个组件的依赖,那么它应该是一个实例方法。

【讨论】:

  • 但是如果我不模拟这个静态方法,我的代码测试会失败……我只是想在调用静态方法时给它一个默认的测试值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 2014-02-02
相关资源
最近更新 更多