2015-03-25 4 views
0

У меня все еще есть некоторые трудности с Mockito. Я хочу иметь два тестовых примера для двух разных объектов. Поэтому я хочу моделировать поведение разных методов в зависимости от значения аргумента.Издевательский метод с разными значениями

Проблема в том, что когда я запускаю метод test(), возвращаемое значение help изменчивым является «b», и утверждение не возвращает true. Если я прокомментирую строку, обозначенную как (***), все будет хорошо.

Как вы можете видеть, я попытался использовать thenAnswer вместо thenReturn, но результат был тот же.

public class TestItAll { 
     TestClass test; 

     HelpClass a ; 
     HelpClass b; 

     @Before 
     public void init(){ 

      a = new HelpClass("a"); 
      b = new HelpClass("b"); 

      Mockito.when(test.getHelp(a)).thenReturn("a"); 
      /*Mockito.when(test.getHelp(a)).thenAnswer(
      new Answer< String>() { 
        public String answer(InvocationOnMock invocation) { 
         return "a"; 
        } 
      });   */ 
      Mockito.when(test.getHelp(b)).thenReturn("b");//(***) 

      /*Mockito.when(test.getHelp(b)).thenAnswer(
      new Answer< String>() { 
        public String answer(InvocationOnMock invocation) { 
         return "b"; 
        } 
      });   */ 
     } 


     @Test 
     public void testA(){ 
      String help= test.getHelp(a); 
      Assert.assertEquals(help, "a"); 
     } 

     /*@Test 
     public void testB(){ 
      String help= test.getHelp(b); 
      Assert.assertEquals(help, "b"); 
     }*/ 
} 

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

+0

Код для 'HelpClass' может быть полезен для получения ответа. (Вы также можете удалить не требуемую часть, то есть прокомментированные части). В качестве побочного примечания, неясно, что вы пытаетесь проверить здесь (возможно, поведение mockito?) –

+0

'getHelp' не является окончательным, не так ли? Если это так, то код Mockito вообще не будет вызван. –

ответ

2

Во-первых, я предполагаю, что ваша декларация TestClass test; является фактически TestClass test = mock(TestClass.class);, в противном случае метод @Before выбрасывает NullPointerException.

При использовании when(test.getHelp(a)) mockito будет использовать метод aequals, чтобы проверить, соответствует ли параметр. Если, например, equals метод всегда возвращает true, он не сможет отличить a от b. Я запустил ваш код с переопределением equals (т. Е. HelpClass объекты равны, только если они являются одним и тем же экземпляром), и оба теста прошли.

Возможно, вы захотите использовать аргумент match - when(test.getHelp(argThat(sameInstance(a)))), чтобы не полагаться на ваш метод equals. Если вам нужно что-то более сложное, чем sameInstance, я бы порекомендовал sameBeanAs matcher от shazamcrest.

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