Тесты Пообщаться с GPT Протестировать код
Программирование Аналитика Дизайн Маркетинг Управление проектами
10 Авг 2023
2 мин
580

Проверка аргументов метода с помощью Mockito

Пройдите тест, узнайте какой профессии подходите

Часто разработчики, работающие с библиотекой Mockito для написания тестов в Java, сталкиваются с проблемой проверки аргументов метода. Они хотят убедиться,

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

Возьмем для примера ситуацию, когда есть некий метод myMethod(Object o), который вызывается внутри другого метода runTestMethod(). И задача состоит в том, чтобы проверить, что myMethod(Object o) был вызван именно с объектом o.

Код может выглядеть примерно так:

Object obj = getObject();
Mockable mock = Mockito.mock(Mockable.class);
Mockito.when(mock.myMethod(obj)).thenReturn(null);

Testable testableObject = new Testable();
testableObject.setMockable(mock);
command.runTestMethod();

И здесь возникает вопрос: как убедиться, что метод myMethod(Object o) вызывается именно с заданным объектом o?

Инстинктивно, многие попытаются использовать Mockito.verify() с Mockito.eq() для проверки:

Mockito.verify(mock.myMethod(Mockito.eq(obj)));

Однако, это не даст ожидаемого результата. Почему? Дело в том, что Mockito.eq() — это аргумент matcher, который сравнивает объекты по значению, а не по ссылке. Это значит, что он пройдет проверку для любого объекта, который «равен» obj.

А что если использовать Mockito.eq() с другими значениями или типами? Как, например, здесь:

Mockito.verify(mock.myMethod(Mockito.eq(null)));
Mockito.verify(mock.myMethod(Mockito.eq("something_else")));

Опять же, это не сработает должным образом, поскольку Mockito.eq() будет просто сравнивать значения, а не ссылки на объекты.

Так как же правильно проверить, что метод был вызван именно с определенным объектом?

Для этого можно использовать Mockito.same(). Этот метод сравнивает объекты по ссылке, а не по значению. Вот как выглядит правильный способ проверки:

Mockito.verify(mock.myMethod(Mockito.same(obj)));

Это гарантирует, что myMethod(Object o) был вызван именно с объектом obj, а не с любым другим.

В заключение, стоит заметить, что Mockito — мощный инструмент для тестирования, который предоставляет множество возможностей. Однако, как и любой другой инструмент, он требует понимания и внимания при использовании.

Добавить комментарий