PowerMock, mockito, проверка статического метода - PullRequest
11 голосов
/ 13 марта 2011

Я пытаюсь заставить 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());
    }
}

В моем модульном тесте я хотел бы проверить, что StaticObj.put вызывается для K и X, когдаони не пустые и не нулевые, поэтому я делаю что-то вроде этого:

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 Ответ

6 голосов
/ 19 июля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...