Самый чистый код, который я придумал, состоял в том, чтобы явно пометить методы, которые должны быть перенаправлены в их реальную реализацию.
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
Я все еще считаю, что предложенная мною версия лучше: реальные статические методы не вызываются при настройке макета, что, к сожалению, происходит с вашим кодом.