2014-01-23 4 views
1

Моя проблема лучше всего описана простым примером. Вот мой класс:Mockito - ясный аргумент captor pr

public class App 
{ 
    void doFirst(String s){ 
     if(s.equals("hello")){ 
      return; 
     } 
     doSecond(s); 
    } 

    void doSecond(String s){ 

    } 
} 

А вот мой тест:

public void testApp() { 
     App a = spy(new App()); 
     ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class); 
     doNothing().when(a).doSecond(argument.capture()); 
     a.doFirst("bye"); 
     assertEquals("bye", argument.getValue()); 
     a.doFirst("hello"); 
     assertEquals(null, argument.getValue());   
    } 

Проблема заключается в том, что эта вторая утверждают терпит неудачу becauseargument.getValue() имеет значение от Previos вызова к doFirst. Могу ли я как-то понять аргумент после первого утверждения, чтобы он был нулевым к моменту достижения второго?

спасибо.

+1

Можете ли вы просто создать еще один аргумент ArgumentCaptor? –

ответ

3

Он смотрит на меня, как вы тестируете два различных условия -

  • что doSecond вызывается с правым аргументом при s не "hello"
  • что doSecond не дозвонились, когда s является "hello"

Это должно быть два отдельных теста.

Кроме того, не используйте ArgumentCaptor и assertEquals. Это то, за чем стоит verify. Вы можете написать свой тестовый класс следующим образом.

@RunWith(MockitoJUnitRunner.class) 
public class AppTest { 
    @Spy App toTest; 

    @Test 
    public void doSecondIsCalledWhenArgumentIsNotHello() { 
     toTest.doFirst("bye"); 
     verify(toTest).doSecond("bye"); 
    } 

    @Test 
    public void doSecondIsNotCalledWhenArgumentIsHello() { 
     toTest.doFirst("hello"); 
     verify(toTest, never()).doSecond(anyString()); 
    } 
} 
+0

Извините, что для меня это действительно работает. В этом примере это нельзя увидеть, но в моем фактическом коде второй результат основан на первом, поэтому они должны быть в одном тесте. Представьте, что в первой функции есть счетчик, и при каждом его приращении он увеличивается, а при его> 2 функция возвращается, в противном случае она вызывает doSeconds(). – user1985273

+0

ОК, вы можете комбинировать их в одном тесте; но, возможно, вы хотите изменить вторую проверку на проверку (toTest, never()). doSecond («hello»); '- Просто убедитесь, что имя метода тестирования точно отражает условие, которое вы тестируете , Не называйте это 'testApp' или' testDoSecond' или что-то в этом роде. –

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