2015-05-21 4 views
0

Я пытаюсь проверить класс, который имеет интерфейс с 3 аргументами. Метод тестирования Я подобен этомуПроверка интерфейса с проверкой Mockito

formElementCallback.stateChanged(formElement1, FormElementState.DISABLED, ""); 
formElementCallback.stateChanged(formElement2, FormElementState.DISABLED, null); 

и это метод испытания

Mockito.verify(mockFormElementCallback, Mockito.atLeastOnce()).stateChanged(Mockito.argThat(new ArgumentMatcher<FormElement>() { 
      @Override 
      public boolean matches(Object argument) { 
       //matcher for formObject 
       FormElement formElement = (FormElement) argument; 
       return true; 
      } 
     }), Mockito.argThat(new ArgumentMatcher<FormElementState>() { 
      @Override 
      public boolean matches(Object argument) { 
       //matcher for state 
       return true; 
      } 
     }), Mockito.argThat(new ArgumentMatcher<Comparable>() { 
      @Override 
      public boolean matches(Object argument) { 
       //matcher for value 
       return true; 
      } 
     })); 

Поскольку интерфейс называется 2 раза, Mockito.verify (объект, Mockito.times (1) не работает.Я попытался объединить логику с atLeastOnce(), но тогда всякий раз, когда я утверждаю formElement1, formElement2 вызывается слишком, чтобы тест не удался. И даже если я использую оператор if, область сопряжения для значения и состояния не будет знать о формы формы.

Есть ли ва что я могу так утверждать?

If argument equals formElement1, Assert state DISABLED, Assert value "" 
If argument equals formElement2, Assert state DISABLED, Assert value null 
Else AssertTrue(false) since interface must not be called with other form elements. 

Редактировать: Решение не должно состоять в том, чтобы объединить 3 аргумента в один и поместить состояние и значение в класс formElement. Это связано с тем, что внешние классы не получают доступ к самому элементу formElement и изменяют состояние вручную. Существует и другая реализация: .stateChanged (тип FormElementType, состояние FormElementState, сравнимое значение);

ответ

0

Можете ли вы так утверждать?

verify(formElementCallback).stateChanged(
    formElement1, FormElementState.DISABLED, ""); 
verify(formElementCallback).stateChanged(
    formElement2, FormElementState.DISABLED, null); 
verifyNoMoreInteractions(formElementCallback); 

См. the javadoc for verifyNoMoreInteractions. Вы можете сделать то же самое с InOrder, если это имеет значение.

+0

Нет, как я уже говорил, когда я проверяю подобное, сначала проверьте, не удалось ли из-за вызова stateChanged (formElement2, DISABLED, ""), а второе не выполнено из-за stateChanged (formElement1, DISABLED, null). Именно по этой причине я попытался объединить две логики в одну. –

+0

Mockito сохраняет и сохраняет все взаимодействия. Каждая проверка проверяет одно согласование. Каждый из них специфичен для поведения по умолчанию ('times (1)'). Если они выходят за рамки этого, это, вероятно, потому, что матчи не достаточно специфичны. У вас нет анонимных встроенных совпадений, которые всегда возвращают 'true' за пределами этого примера, не так ли? –

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