Mockito 3.4中的模拟静态方法


概述

从Mockito的3.4版开始,可以模拟静态方法。
如果您只想模拟静态方法,则无需安装PowerMock。

环境

  • mockito-core-3.4.0.jar
  • byte-buddy-1.10.16.jar

除上述jar外,还需要新的mockito-inlinebyte-buddy-agent
--mockito-inline-3.4.0.jar
--byte-buddy-agent-1.10.16.jar

每个都可以从Mockito官方网站ByteBuddy官方网站下载。

<表格>

版本


<身体>

java

8

JUnit

5


样本代码

类被嘲笑

包含

静态方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MockedClass {

    public static String methodA() {
        return "val1";
    }

    public static String methodB() {
        return "val2";
    }

    public static String methodC(String str) {
        return str;
    }
}

测试等级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class MockedClassTest {

    @Test
    public void test() throws Exception {

        // 期待値
        String expected_methodA = "test";
        String expected_methodB = "val2";

        // 対象クラスのモック化
        MockedStatic<MockedClass> mocked = Mockito.mockStatic(MockedClass.class);
        // 戻り値を設定してスタブ化
        mocked.when(MockedClass::methodA).thenReturn(expected_methodA);
        // スタブ化しない場合
        mocked.when(MockedClass::methodB).thenCallRealMethod();

        // 実行
        String actual_methodA = MockedClass.methodA();
        String actual_methodB = MockedClass.methodB();

        // 結果確認
        assertEquals(expected_methodA, actual_methodA);
        assertEquals(expected_methodB, actual_methodB);
    }
}

模拟Mockito.mockStatic()
thenReturn() 设置返回值
thenCallRealMethod() 如果您想在不设置返回值的情况下调用真实对象
您可以使用。

如何指定静态方法

示例代码中,它是由MockedClass::methodA之类的方法引用指定的,但是有参数时的描述方法如下。

1
2
mocked.when(() -> { MockedClass.methodC(Mockito.anyString()); })
      .thenReturn("stub");

您可以在

参数列表中指定Mockito的any()。
当然,即使没有参数,使用lambda表达式编写也是有效的。
{}根据lambda表达式描述规则可以省略。

1
2
mocked.when(() -> MockedClass.methodA())
      .thenReturn("stub");