2015-12-13 4 views
2

Я получил некоторые бизнес-логика класс:Можно ли проверить метод вызова метода объекта с помощью Mockito?

public class SomeService { 
    public void doFirst() {} 

    public void doSecond() { 
     doFirst(); 
    } 
} 

и испытание для него:

public class SomeServiceTest { 

    private SomeService service; 

    @Before 
    public void setUp() { 
     service = new SomeService(); 
    } 

    @Test 
    public void doSecond_someCondition_shouldCallFirst() { 

     // given 
     ... 

     // when 
     service.doSecond(); 

     //then 
     how to verify doFirst() was called? 
    } 
} 

Как проверить doFirst() был вызван не на фиктивном, но реальный сервис?

+1

Http: // site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#13 –

+0

Но реальный метод - это вызов в любом случае. Это не совсем я пытаюсь добиться:/ –

+1

шпион по первому методу, вызовите второй, убедитесь, что был вызван первый. Так же, как объяснено в документе. По крайней мере, покажите, что вы пробовали. –

ответ

4

Интересно, почему вы хотите проверить, какой метод вызывает ваш метод под тестами. Звучит так же, как и тестирование whitebox.

На мой взгляд, вы хотите проверить результат вызова, а не путь туда, поскольку это может легко измениться (т. Е. При рефакторинге).

Итак, если результат doSecond() совпадает с doFirst(), вы можете написать тест для doFirst() и использовать тот же тест (т. Е. Набор утверждений) для тестирования doSecond().

Но если вы действительно хотите, чтобы проверить, является ли doFirst() был вызван doSecond() вы можете обернуть службу в качестве шпиона, а затем вызвать проверку на шпиона:

//given 
SomeService service = new SomeService(); 
SomeService spy = Mockito.spy(service); 
//when 
spy.doSecond(); 
//then 
verify(spy).doFirst(); 
1

Похоже, вы хотите избежать реального doFirst, вызванного в вашем тесте? если да, то попробуйте это ...

//given 
    boolean firstCalled = false; 
    SomeService fakeService = new SomeService { 
      @Override 
      public void doFirst() { 
      firstCalled = true; 
      } 
    } 
//when 
fakeService.doSecond(); 

    // then 
    assertTrue(firstCalled); 

Это тестирование/насмешливый техника называется «подкласс и переопределить» по понятным причинам.

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