2016-10-05 5 views
9

Здравствуйте, я столкнулся с проблемой при попытке написать тестовый пример JUnit и относительно новичок в Mockito.Mockito - thenCallRealMethod() on void function

У меня есть функция класса, который я издеваюсь, эта функция имеет тип возврата void. При вызове этой функции из моего издевающегося класса я понимаю (и опыт отладки), что он НЕ вызывает исходную функцию. Чтобы преодолеть это, я попытался использовать «когда» с «thenCallRealMethod()».

when(instance.voidFunction()).thenCallRealMethod(); 

«voidFunction» полон логики, которую я НЕ хочу стрелять. Я извлек их в заявления, чтобы избежать этого. Я прочитал, что должен использовать формат doReturn().when().voidFunction(), однако это не вызывает реальный метод.

Было также мое понимание, что я не мог использовать Шпион здесь, из-за того, что я не хочу, чтобы voidFunction() вызывался перед операциями «когда». Любая помощь приветствуется. Я приношу свои извинения, если это очень простое решение, так как мое понимание mockito не очень велико, несмотря на то, что вы читаете немного. Благодаря!

+0

Мой ответ на [этот вопрос] (http://stackoverflow.com/q/11462697) объясняет, почему я думаю, что делать/когда делать что-то лучше, чем когда/тогда. Если вы просто изучаете Мокито, то сейчас самое время его прочитать. –

+0

Спасибо, что это действительно полезно, я изучал/основывал свои тестовые файлы уже существующих в нашей устаревшей кодовой базе и видел оба пути, но я согласен с вашим советом после того, как столкнулся с недостатками, когда/тогда уже дважды – CRDamico

+1

Смущать будущих читателей может синтаксис. Подумайте внимательно, вы должны. –

ответ

14

Синтаксис when не будет работать с методом пустот (он не будет вписываться в when), и doReturn не применяется, когда нет возвращаемого значения. doCallRealMethod, скорее всего, ответ, который вы хотите.

doCallRealMethod().when(instance).voidFunction(); 

Имейте в виду, что при вызове метода реального на макете, вы не можете получить очень реалистичное поведение, потому что в отличие от шпионов издевались объектов пропустит все конструкторы и инициализатора вызовы в том числе для установки полей. Это означает, что если ваш метод использует какое-либо состояние экземпляра вообще, он вряд ли будет работать как макет с doCallRealMethod или thenCallRealMethod. С помощью шпиона вы можете создать реальный экземпляр своего класса, а затем метод Mockito.spy скопирует это состояние экземпляра, чтобы сделать более реалистичное взаимодействие.

+0

Спасибо, это именно то, что мне нужно, я специально искал этот метод и не мог его найти. Похоже, он работает! – CRDamico