2015-09-23 4 views
-1

Я начал использовать JUnits (Mockito) со вчерашнего дня. Я искал аналогичный вопрос, но не нашел.Как издеваться над вызовом метода без фактического вызова его подтекстов

У меня есть класс с методом method1(), который в свою очередь вызывает method2().

Я не хочу издеваться method2

Я насмешливый вызов method1(). Я ожидал, что он вернет пользовательский объект (не забегая вперед и позвонив method2), который я хочу. Но вместо этого он продолжает и пытается позвонить method2().

class A { 
    method1() { 
    //do something. 
    method2(); 
    } 
} 

я издевался method1 и вернуть любой объект (скажем new Integer(1)).

Я не хочу, чтобы method2 называться. но когда я отлаживаю этот Junit. Он идет и звонит method2. Следовательно, не удается.

+2

Это швы, что вы не называете насмешливый, но оригинальный класс. Отправьте свой тестовый код, чтобы можно было увидеть, что происходит –

ответ

-1

Обычно вы издеваетесь над интерфейсами или абстрактными классами и предоставляете реализацию абстрактных методов. В вашем случае вы хотите заменить реальную реализацию конкретного класса. Это может быть достигнуто посредством частичных издевательств.

http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#16

0

При использовании синтаксиса, как это:

@Test public void yourTest() { 
    A mockA = Mockito.mock(A.class, Mockito.CALLS_REAL_METHODS); 
    when(mockA.method1()).thenReturn(Integer.valueOf(1)); 
} 

то первое, что Java будет сделать, это оценить when(mockA.method1()), который требует призывающую mockA.method1(), чтобы получить значение, чтобы пройти в when. Вы не замечаете этого с другими издевательствами, потому что Mockito издевается над замечательными значениями по умолчанию, но со шпионами и CALLS_REAL_METHODS mocks это гораздо большая проблема. Очевидно, что этот синтаксис не будет работать.

Вместо этого следует использовать методы, начиная с do:

@Test public void yourTest() { 
    A mockA = Mockito.mock(A.class, Mockito.CALLS_REAL_METHODS); 
    doReturn(Integer.valueOf(1)).when(mockA).method1(); 
} 

В рамках .when(mockA), Mockito вместо этого возвращает экземпляр, который не имеет поведения, поэтому вызов method1() никогда не происходит на реальном случае. do синтаксис также работает с методами void, что делает его более гибким, чем синтаксис when(...).thenReturn(...). Некоторые разработчики выступают за использование doReturn все время; Я предпочитаю thenReturn, потому что его немного легче читать, а также можно проверить тип возвращаемого типа.


Как примечание стороны, предпочитают Integer.valueOf(1) над new Integer(1), если вы абсолютно не нужен новый экземпляр марки. Java хранит кеш-память небольших целых чисел, и это может быть быстрее, чем выделение новой ссылки, если вам нужно вручную установить int в Integer.

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