2014-12-01 4 views
1

У меня есть структура, какMock метод суперкласса Тестовые Mockito

class A{ 
public String mymethod(){ 
    //Some processing here 
} 
} 
class B extends A{ 
    public void mySomeMethod(){ 
    String myToken = super.myMethod(); 
    //processing 
    } 
} 

Теперь я хочу, чтобы дразнить вызов упомянутый здесь Строка myToken = super.myMethod(); и вернуть константу String в мой тестовый класс. Я пытался делать

Mockito.doReturn("gdgwdgweg23et287").when((A)bSpy).myMethod(); 

Но это разве помогает как метод все еще вызывался. Может кто-нибудь предложить подход здесь

+0

Из интереса, * почему * вы пытаетесь издеваться над этим? Если 'mymethod' вызывает какую-то другую зависимость, можете ли вы издеваться над этим? –

+0

единичный тестовый пример должен иметь свой объем, ограниченный этим конкретным методом, и я стараюсь избежать любого вызова внешнего метода. метод выше пытается сгенерировать некоторый токен, основанный на некоторой логике, которая является моим случаем, и я стараюсь избегать этого, что ИМО полностью в порядке. Вопрос здесь не в том, является ли я вне интереса или нет, то в том, как издеваться над методом, который вызывается с помощью супер, если бы этот метод был абстрактным, а его реализация была в классе B, я мог бы издеваться над ним легко, но так как реализация этот метод будет распространен в разных классах, я сделал это так. – vaibhav

+2

Я предлагаю быть прагматичным, а не догматичным. Идея о том, что единичный тест не должна заканчиваться вызовом * любого * кода, отличного от метода, который он пытается тестировать, редко действительна в действительности - вы бы хотели избежать вызова методов String, издевательства подстроки и т. Д.? Если вы действительно хотите продолжать идти по этому пути (и я бы рекомендовал, чтобы вы этого не сделали), я бы * ожидал, что это будет возможно с кодом, например, вы уже опубликовали - в конце концов, метод isn 't 'final'. Это поможет, если вы разместите * полный * пример как производственного кода, так и теста, чтобы мы могли воспроизвести его. –

ответ

0

Сначала вам не нужно бросать экземпляр B в A, кастинг здесь не будет работать.
Тогда мой второй вопрос: как создать объект bSpy?

+0

bSpy создается как Mockito.spy (новый B()) – vaibhav

2

Причина, по которой ведется реальный метод, заключается в том, что шпион - это всего лишь обертка вокруг объекта-шпионажа. Как только вызов метода находится внутри этой границы обертки, оболочка (шпион) не задействована. Более того, вы не можете останавливать методы, когда объект spied вызывает себя. Это происходит потому, что вызов уже находится внутри границы обертки (шпиона).

Если вы позвоните по телефону myMethod на шпионаже, вы получите оштукатуренную версию. Но если вы вызываете mySomeMethod на шпиона, здесь нет заглушки, поэтому он передает вызов на экземпляр B, который вызывает на самом деле this.myMethod.

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