2009-02-04 3 views
42

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

я делаю что-то вроде этого в коде тестируемый:

row.setSomething(value); 
row.setSomethingElse(anotherValue); 
row.editABunchMoreStuff(); 
row.saveToDatabase(); 

В моем издеваться, я не забочусь о том порядке, в котором я редактировать все на ряде, но это очень важно, чтобы Я не попытаюсь сделать что-нибудь еще после того, как я его сохранил. Есть ли хороший способ сделать это?

Заметьте, что я не ищу подтвержденияNoMoreInteractions: он не подтверждает, что saveToDatabase - это последняя вызванная вещь, и она также терпит неудачу, если я вызываю что-либо в строке, которую я явно не проверяю. Я хотел бы быть в состоянии сказать что-то вроде:

verify(row).setSomething(value); 
verify(row).setSomethingElse(anotherValue); 
verifyTheLastThingCalledOn(row).saveToDatabase(); 

Если это поможет, я переключение на Mockito из теста JMock, который сделал это:

row.expects(once()).method("saveToDatabase").id("save"); 
row.expects(never()).method(ANYTHING).after("save"); 
+5

записку из будущего: мы в конечном счете переработан это, чтобы избежать зависимости заказа. В частности, мы переместили часть saveToDatabase() на внешний уровень кода, где он автоматически вызывается в нужное время. В общем, если вам нужно сделать что-то вроде этого с макетом, ваши тесты говорят вам о рефакторе. Тем не менее, все же приятно проводить тест, который может работать до тех пор, пока дизайн не будет изменен. –

ответ

52

Я думаю, что это требует больше пользовательских Работа.

verify(row, new LastCall()).saveToDatabase(); 

, а затем

public class LastCall implements VerificationMode { 
    public void verify(VerificationData data) { 
     List<Invocation> invocations = data.getAllInvocations(); 
     InvocationMatcher matcher = data.getWanted(); 
     Invocation invocation = invocations.get(invocations.size() - 1); 
     if (!matcher.matches(invocation)) throw new MockitoException("..."); 
    } 
} 

Предыдущий ответ:

Вы правы. verifyNoMoreInteractions - это то, что вам нужно.

verify(row).setSomething(value); 
verify(row).setSomethingElse(anotherValue); 
verify(row).editABunchMoreStuff(); 
verify(row).saveToDatabase(); 
verifyNoMoreInteractions(row); 
+0

Нет, это не так. Я уточнил вопрос, чтобы выяснить, почему. –

+0

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

+1

ошибка компиляции: желаемый не может быть разрешен – kmalmur

0

Этот вопрос привел меня, чтобы сделать некоторые улучшения в Проверок API в JMockit (доступна в следующей версии 0.983).

Решение, которое я придумал позволяет писать (в методе испытаний):


    new VerificationsInOrder() {{ 
     unverifiedInvocations(); 
     row.saveToDababase(); 
    }}; 

... если вы хотите, чтобы убедиться, что определенный метод вызывается после того, как все остальное. Чтобы убедиться, что это происходит, до все другие вызовы, просто переместите вызов на верх. Это действительно относится к любой последовательности последовательных вызовов.

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


    new Verifications() {{ 
     row.setSomething(value); 
     row.setSomethingElse(anotherValue); 
    }}; 

Хотя немного долго из-за использования анонимных внутренних классов, этот синтаксис является одновременно простым и гибким; обратите внимание, как он добавляет структуру к тесту и избегает повторения вызовов методов (например, verify(...)). Это больше, чем описано здесь (Hamcrest matchers, invocation counts и т. Д.), И это не ограничивается проверкой методов экземпляра (статические методы и конструкторы можно издеваться и проверять одинаково).

9

Не 100% по теме, но я просто искал, чтобы найти противоположность от проверки, и это был единственный соответствующий результат, и это закончилось тем, что я был после Мокито.verifyZeroInteractions (макет);

Просто упакуйте кто-либо другой в конце концов здесь ищет это ...

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