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 вызовет ошибку. Ваш процесс проверки упорядочен.