MockStatic 测试 returns 一个 int 数组的静态方法

MockStatic test a static method that returns an int array

我的函数

class A {
   public static int[] getArray(String text) { return new int[]{0,3}; }
}

测试方法:

private static MockedStatic<A> mock;

@Test
public void Should_return_array_getArray() {
    mock
        .when(() -> A.getArray(text)) // line: 58
        .thenReturn(new int[] {0, 3});
    final int[] values = A.getArray(text);
    System.out.println("value:"+ values[1]);
    assertEquals(3, values[1]);
}

出现以下错误:

org.mockito.exceptions.misusing.MissingMethodInvocationException at StringTest.java:58

我不确定你要测试什么..因为你的实际方法没有任何参数但在测试用例中你试图传递 text 变量...

如果你想测试实际的方法执行,你不需要模拟。以下是测试目标方法的实际调用以及模拟的示例:

@Test
public void test_actual_static_method() {
    final int[] values = A.getArray();
    Assertions.assertEquals(3, values[1]);
}

@Test
public void test_mocked_static_method() {
    MockedStatic<A> aMockedStatic = Mockito.mockStatic(A.class);
    aMockedStatic.when(A::getArray).thenReturn(new int[] {100,200});
    Assertions.assertEquals(200, A.getArray()[1]);
}

你还需要mockito-inline图书馆

@Test
public void test_mocked_static_method_with_args() {
    try(MockedStatic<A> aMockedStatic = Mockito.mockStatic(A.class)) {
        aMockedStatic.when(() -> A.getArrayWithArg("s1")).thenReturn(new int[]{100, 200});
        Assertions.assertEquals(200, A.getArrayWithArg("s1")[1]);
    }
}

谢谢@Subhash ...你建议的解决方案有效:) 但我调用了“.thenCallRealMethod()”

 @Test
    public void Should_return_truth_getArray() {
        try ( MockedStatic<A> mocked = mockStatic(A.class)) {
            mocked
                .when(() -> A.getArray(text))
                .thenCallRealMethod();
            final int[] values = A.getArray(text);
            System.out.println("value:"+ values[1]);
            assertEquals(3, values[1]);
        }
    }