PowerMock, mockito, проверить статический метод
Я пытаюсь заставить PowerMock работать с mockito, и я следую документации здесь: http://code.google.com/p/powermock/wiki/MockitoUsage13.
Чтобы упростить бит, скажем, что у меня есть статический метод:
StaticObj.put(String key, String val) { ... }
И тестируемый класс делает что-то вроде этого:
public class ClassToTest {
public void doSomething(Params p) {
if (StringUtils.isNotBlank(p.getK()) StaticObj.put("k1", p.getK());
if (StringUtils.isNotBlank(p.getX()) StaticObj.put("x1", p.getX());
}
}
В моем unit test я хотел бы проверить, что StaticObj.put вызывается для K и X, если они не пусты или null, поэтому я делаю что-то вроде этого:
public void testNormalCase() {
// assume that mocking setup for statics already happened in some @Before function..
Params params = new Params("k", "x");
ClassToTest classToTest = new ClassToTest();
classToTest.doSomething(params);
// now I want to verify:
PowerMockito.verifyStatic(times(1));
StaticObj.put("k1", "k1");
PowerMockito.verifyStatic(times(1));
StaticObj.put("x1", "x");
}
Это работает, и это то, что я ожидаю. Что не работает, если я прокомментирую проверку для K, тогда проверка на X не удалась! Сообщение об ошибке указывает, что ( "x1", "x" ) ожидается, но получится ( "k1", "k" ). Почему это? Не правильно ли это кодирование?
И это заставляет меня думать, что следующий тип теста, который проходит, может пройти по неверной причине:
public void testOtherCase() {
// assume that mocking setup for statics already happened in some @Before function..
Params params = new Params("k", null);
ClassToTest classToTest = new ClassToTest();
classToTest.doSomething();
// now I want to verify:
PowerMockito.verifyStatic(never());
StaticObj.put(eq("x1"), anyString());
}
например. Интересно, видит ли powermock "k1", решает, что "x1" никогда не вызывался и не проходил мимо. (?)
Чтобы указать его в целом, у меня есть статический метод, который называется N раз (где N изменяется в зависимости от входных параметров). И я хочу проверить, что он был вызван в правильных случаях (которые могут быть определены входными параметрами). Кажется, что powermock не справляется с этим, если я не понимаю.
Спасибо за любые идеи!
Ответы
Ответ 1
Я внимательно прочитал этот вопрос и вопрос, но не уверен, понял ли я их четко. По моему мнению, он исправляет, что powermock вызывает исключение, когда вы передаете k и x, но проверяете только k.
Потому что вы издеваетесь над статическим методом StaticObj.put, когда передаете параметр k и x и проверяете его с помощью
PowerMockito.verifyStatic(times(1));
StaticObj.put("k1", "k1");
PowerMockito.verifyStatic(times(1));
StaticObj.put("x1", "x");
Это должно сработать. И когда вы проверяете параметр k и x, проверка на k комментируется.
// PowerMockito.verifyStatic(times(1));
// StaticObj.put("k1", "k1");
PowerMockito.verifyStatic(times(1));
StaticObj.put("x1", "x");
Powermock сначала вызовет вызов с put ( "k1"...), поэтому проверка x вызовет ошибку. Ваш процесс проверки упорядочен.