PowerMockito mockStatic с вводом - PullRequest
0 голосов
/ 19 мая 2019

Мне нужно смоделировать статический метод, который имеет входной аргумент.Для других функций в классе должны вызываться оригинальные методы, а для функции, которую я пытаюсь смоделировать, должна выполняться только заглушенная заглушка.Я попробовал следующий код, но он не работает должным образом.

public class Foo {
    public static String static1() {
        System.out.println("static1 called");
        return "1";
    }

    public static String static2() {
        System.out.println("static2 called");
        return "2";
    }

    public static String staticInput(int i) {
        System.out.println("staticInput called");
        return "static " + i;
    }
}

@RunWith(PowerMockRunner.class)
@PrepareForTest({Foo.class })
public class TestMockito {

    @Test
    public void test() throws Exception {

        PowerMockito.mockStatic(Foo.class, Mockito.CALLS_REAL_METHODS);
        PowerMockito.doReturn("dummy").when(Foo.class ,"static1");

        PowerMockito.when(Foo.staticInput(anyInt())).thenAnswer(invocation -> {
            System.out.println((int)invocation.getArgument(0));
            return "staticInput mock";
        });


        //        PowerMockito.doAnswer(new Answer() {
        //            @Override
        //            public Object answer(InvocationOnMock invocation) throws Throwable {
        //                int i = (int) invocation.getArguments()[0];
        //                System.out.println(i);
        //                return i;
        //            }
        //
        //        }).when(Foo.staticInput(anyInt()));

        System.out.println(Foo.static1());
        System.out.println(Foo.static2());
        System.out.println(Foo.staticInput(7));
    }
}

Я получаю следующий вывод:

staticInput called  
dummy 
static2 called  
2 
staticInput called  
static 7

1 Ответ

0 голосов
/ 20 мая 2019

Самый чистый код, который я придумал, состоял в том, чтобы явно пометить методы, которые должны быть перенаправлены в их реальную реализацию.

PowerMockito.mockStatic(Foo.class);
PowerMockito.doReturn("dummy").when(Foo.class, "static1");
PowerMockito.when(Foo.static2()).thenCallRealMethod();
PowerMockito.when(Foo.staticInput(anyInt())).thenAnswer(invocation -> {
    System.out.println((int)invocation.getArgument(0));
    return "staticInput mock";
});

Вывод (соответствует моим ожиданиям):

dummy
static2 called
2
7
staticInput mock

Как ни странно, мой вывод из оригинального кода отличается от вашего вывода (и показывает, что статический метод с входным параметром является ложным).

staticInput called
dummy
static2 called
2
7
staticInput mock

Я все еще считаю, что предложенная мною версия лучше: реальные статические методы не вызываются при настройке макета, что, к сожалению, происходит с вашим кодом.

...