Как проверить с помощью PowerMock метод, который вызывает другой частный метод void из того же класса? - PullRequest
3 голосов
/ 08 декабря 2011

У меня есть класс, у которого есть несколько методов, как в примере.

public class TestClass {

    public boolean aMethod()
    {
        voidMethod();
        return true;
    }

    private void voidMethod()
    {
        ... does something ...
    }

    ... other methods ...
}

Я хочу проверить aMethod с помощью powermock, и все методы должны работать нормально, кроме voidMethod. Я создал частичный макет TestClass, чтобы заставить voidMethod ничего не делать. Но я не знаю, как ожидать вызова этого метода.

testObject = createPartialMock(TestClass.class, "voidMethod");
expectPrivate(testObject, "voidMethod");

Я получаю сообщение об ошибке во второй строке:

Метод ожидаемого (T) типа EasyMock не применим для аргументов (void)

Как я могу исправить эту проблему?

Ответы [ 2 ]

2 голосов
/ 30 ноября 2012

Похоже, PowerMock не может смоделировать приватный метод void (только приватные методы с возвращенным значением).Они должны действительно предоставить более полезную ошибку компилятора, чтобы явно сказать это.EasyMock совсем не издевается над приватными методами.Ответ @ StanislawLeventhal ссылается на синтаксис для ожидания (записи) вызовов к не приватному методу void с использованием EasyMock.

Сначала вы должны подумать, имеет ли смысл то, что вы пытаетесь сделать, и что действительно нужнобыть насмешливымСчитайте это запахом кода, когда вы издеваетесь над приватным методом;Может быть, вам нужно сделать это, но обычно есть способ избежать этого.Кажется очевидным критически подумать о том, почему вы издеваетесь, но легко запутаться и пропустить что-то.

Почему в вашем тестовом классе должен быть закрытый метод, который вы не можете напрямую вызывать и который нужно высмеиватьвместо этого, но который не возвращает значение?Обычно насмешка используется для контроля того, что возвращается из метода;здесь вы в основном говорите, что этот метод должен быть вызван, но вы хотите переопределить его реализацию ничем (если я правильно понимаю).Я не уверен, что могу вспомнить ситуацию, когда это было бы полезно или необходимо в тестовом классе.Приведенный вами пример слишком обобщен, чтобы понять причины этого, но вы должны попытаться выяснить, есть ли лучший способ достичь вашей цели.

2 голосов
/ 08 декабря 2011

Используйте простой вызов, как это:

testObject.voidMethod(); // don't use "expect" for voids
expectLastCall().times(3); // use this for expectations

И не забудьте reply() после всех ваших ожиданий и verify() после запуска проверенного кода.

...