Поскольку ваши комментарии указывают на то, что изменение вашего производственного кода невозможно, вам «просто» нужно погрузиться в статические аспекты PowerMock; как описано, например, здесь.
В основном вам нужно включить IgnoreCall для статического имитации; а затем вы делаете вызовы ignoreMethodCall() бездейственными.
Но, как вы продолжаете спрашивать: основная проблема вашего вопроса заключается в том, что вы хотите имитировать метод static, который является void. У меня есть полный пример ниже, но перед этим некоторые пояснения.
Дело в том, что вы вызываете метод по двум причинам:
- У него есть побочный эффект
- Он возвращает значение и, возможно, также вызывает побочный эффект.
Метод void можно вызывать только для побочных эффектов. И дело в том, что когда вы выполняете статические насмешки, это работает на уровне класса.
Значение: вы указываете PowerMock «предотвратить» выполнение любого из статических методов некоторого класса; вы просто «стираете» побочные эффекты всех этих статических методов! Таким образом, говоря PowerMock делать эти статические макеты, все методы void уже «ушли».
Но, как уже говорилось, вы также можете вызывать методы для их возвращаемого значения. И тогда в дело вступает метод when()
Mockito. Вы используете этот метод, чтобы сказать: когда этот метод, возвращающий значение, вызывается, сделайте то или иное.
Короче говоря; вот [mcve], используя элементы, которые вы просили:
package ghostcat.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
class IgnoreCall {
public static void ignoreMethodCall(Object o) {
System.out.println("SHOULD NOT SHOW UP: " + o);
}
}
class CuT {
public static Object call(Object bean) {
System.out.println("statement1");
IgnoreCall.ignoreMethodCall(bean);
System.out.println("statement2");
return "whatever";
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(IgnoreCall.class)
public class PMTest {
@Test
public void test() {
PowerMockito.mockStatic(IgnoreCall.class);
CuT.call("yeha");
}
}
Как в вашем примере... есть IgnoreCall; используется внутри этого статического метода, который я только что назвал «вызовом».
Это печатает:
statement1
statement2
Когда я захожу и комментирую
// PowerMockito.mockStatic(IgnoreCall.class);
Он печатает:
statement1
SHOULD NOT SHOW UP: yeha
statement2
Итак, простой пример, который должен показать вам точно, что вам нужно сделать.
Я работал с eclipse neon, IBM java8 JDK и просто импортировал все JAR-файлы из powermock-mockito-junit-1.6.6.zip в свой тестовый проект.
person
GhostCat
schedule
09.12.2016
PowerMock can fix that problem
, поделитесь как? - person David B   schedule 09.12.2016IgnoreCall.ignoreMethodCall(Bean)
имеет ряд внутренних вызовов статического метода (выходящих за рамки этого вопроса). - person David B   schedule 16.12.2016