2011-12-08 5 views
3

У меня есть класс, который имеет некоторые методы, как в примере.Как проверить с помощью PowerMock метод, который вызывает другой частный метод void из того же класса?

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 не применяется для аргументов (недействительным)

Как может Я исправляю эту проблему?

ответ

2

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

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

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

+0

Извините, у меня была ошибка, но это не меняет поведение. VoidMethod вызывается из метода aMethod, и это частный метод. В любом случае, я ожидаю вызова метода voidMethod из aMethod.If даже voidMethod будет публичным, будь то testObject.voidMethod(); относится к моему тестированию aMethod ?? – shift66

+0

Поскольку voidMethod() является приватным, этот ответ никогда не сможет работать, он даже не будет компилироваться. –

2

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

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

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

+0

Если бы это ответили на вопрос, не могли бы вы отметить его как ответ? – hotshot309

+0

Я сначала поддержал этот ответ, но через день я снова просмотрел проблему, и я не могу воспроизвести ее. Кажется, что сменил66, кажется, работает для меня без исключения. – Matt

Смежные вопросы