Часто разработчики, работающие с библиотекой 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 — мощный инструмент для тестирования, который предоставляет множество возможностей. Однако, как и любой другой инструмент, он требует понимания и внимания при использовании.
Добавить комментарий