Mockito проверяет последний вызов на объекте - PullRequest
0 голосов
/ 24 мая 2018

У меня есть немного логики, которую нужно проверить, например:

{
    ...
    A.add("1");
    ...
    A.add("what ever");
    ...
    A.add("2");
    A.delete("5");
    ...
}

Я уже сменил A в своем тесте, и я могу проверить, что метод add вызывается один раз для аргумента ("2")) например:

Mockito.verify(mockedA).add("2");

Мой вопрос: как я могу проверить, могу ли я проверить, что последний вызов метода add - это add ("2") вместо других аргументов.

Так какТест выше не может поймать, если кто-то случайно добавил другой вызов, такой как add ("3") в последнем.Пожалуйста, обратите внимание, что мы не заботимся о других вызовах методов на A после этого.Мы также не заботимся о временах вызываемого метода, последовательности вызываемых методов. Ключевым моментом здесь является то, можем ли мы проверить последний истинный аргумент для определенного метода определенного mockedObject.

Если вы спросите, зачем вам такая функциональность, я бы сказал в реальномВ мире нам, возможно, потребуется обработать некоторую логику, которая задает что-то, и последний набор выигрывает, и, чтобы случайно избежать кого-то, поставили какую-то другую вещь неожиданной, и я хотел бы использовать наше UT, чтобы поймать это.И чтобы не сделать тест слишком сложным и аккуратным, поэтому я ожидаю только проверки последнего вызова определенного метода объекта вместо проверки чего-то вроде order / noMoreInteractions / AtMostTimes и т. Д.

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Для меня это выглядит так, что вы издеваетесь над классом данных.По моему опыту лучше оставить (с состоянием) классы данных и фиктивные (без состояния) сервисы.Таким образом, вы можете проверить, что тестируемый метод производит правильные данные, а не просто проверять серию вызовов.Наряду со сборщиками тестовых данных (что упрощает создание экземпляров ваших классов данных с некоторым состоянием по умолчанию, например, с использованием шаблона построителя), становится очень просто писать тесты.проверить, что вы хотите, это использовать InOrder, и проверить каждый из вызовов на макете, и завершиться verifyNoMoreInteractions.

0 голосов
/ 25 мая 2018

Спасибо @ staszko032, вдохновленный ArgumentCaptor, вместо getAllValues ​​и проверки последовательности, мы можем использовать getValue из captor, поскольку getValue из captor всегда получает последний истинный аргумент.Мы можем сделать это так:

    ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
    Mockito.verify(mockedA, Mockito.atLeastOnce()).add(captor.capture());
    Assert.assertEquals("2", captor.getValue());
0 голосов
/ 24 мая 2018

О порядке вызовов

По умолчанию Mockito.verify() не имеет значения для порядка вызовов.
Чтобы принять это во внимание, оберните макет вInOrder экземпляра и выполните проверку вызова для этого экземпляра.

Об отсутствии больше взаимодействий

Если имитирование больше не вызывается после методов, которые вы хотите проверить, вы можете использовать Mockito.verifyNoMoreInteractions(Object... mocks), который проверяет, если какой-либо изданные mock-ы имеют любые неподтвержденные взаимодействия, такие как:

InOrder inOrder = Mockito.inOrder(mockedA);
inOrder.verify(mockedA).add("1");
inOrder.verify(mockedA).add("2");
Mockito.verifyNoMoreInteractions(mockedA);

Если mock все еще может быть вызван после методов, которые вы хотите проверить, вы можете добавить после того, как ваш проверяет вызов к verify(T mock, VerificationMode mode)передача VerificationMode, которая проверяет, что было выполнено не более 2 вызовов.

InOrder inOrder = Mockito.inOrder(mockedA);
inOrder.verify(mockedA).add("1");
inOrder.verify(mockedA).add("2");
Mockito.verify(mockedA, Mockito.atMost(2)).add(Mockito.anyString());

Предупреждение о вашей мысли и способе насмешки

Так как тест выше не может поймать, если кто-то случайно добавляетдругой вызов, такой как add («3») в последнем.

Mockito предоставляет мощный и широкий набор инструментов для работы с имитаторами.Некоторые функции, такие как проверка и, в частности, проверка того, что больше не было обнаружено взаимодействия о макете или конкретном методе макета , делают ваш тест более сложным для чтения и поддержки .
А также, в настоящее времяВы хотите проверить, что вызовы на макете были выполнены в определенном порядке.Но вы, как правило, хотите использовать эти проверки только по мере необходимости, то есть в соответствии с бизнес / логическими сценариями, а не с техническими вызовами.
Например, предположим, что в тестируемом методе у вас есть случай, когда по бизнес-причинам вызывается фиктивный метод 3раз и другой случай, когда смоделированный метод вызывается 2 раза.Возможно, имеет смысл проверить, что он вызывается только 2 раза, а не больше в случае с двумя ожидаемыми вызовами.
Но, в общем, вы должны быть осторожны, чтобы ваш модульный тест не использовал чрезмерно насмешливую проверку, которая может выглядетькак утверждение об описании потока, а не утверждение о поведении / логике.

...