Может ли Мокито заглушить метод без учета аргумента?
195606 просмотра
4 ответа
Я пытаюсь протестировать некоторый унаследованный код, используя Mockito.
Я хочу заглушить, FooDao
что используется в производстве следующим образом:
foo = fooDao.getBar(new Bazoo());
Я могу написать:
when(fooDao.getBar(new Bazoo())).thenReturn(myFoo);
Но очевидная проблема заключается в том, что getBar()
никогда не вызывается с тем же Bazoo
объектом, для которого я обозначил метод. (Прокляни этого new
оператора!)
Мне бы понравилось, если бы я мог заглушить метод таким образом, чтобы он возвращался myFoo
независимо от аргумента. Если это не удастся, я выслушаю другие предложения по обходному пути, но я действительно хотел бы избежать изменения производственного кода до тех пор, пока не будет разумного покрытия тестами.
Ответы (4)
434 плюса
when(
fooDao.getBar(
any(Bazoo.class)
)
).thenReturn(myFoo);
или (чтобы избежать null
s):
when(
fooDao.getBar(
(Bazoo)notNull()
)
).thenReturn(myFoo);
Не забудьте импортировать совпадения (доступно много других):
Для Mockito 2.1.0 и новее:
import static org.mockito.ArgumentMatchers.*;
Для более старых версий:
import static org.mockito.Matchers.*;
Автор: Tomasz Nurkiewicz
Размещён: 11.05.2011 07:42
15 плюса
Используйте как это:
when(
fooDao.getBar(
Matchers.<Bazoo>any()
)
).thenReturn(myFoo);
Прежде чем вам нужно импортировать Mockito.Matchers
13 плюса
http://site.mockito.org/mockito/docs/1.10.19/org/mockito/Matchers.html
anyObject()
должно соответствовать вашим потребностям.
Также вы всегда можете рассмотреть возможность реализации hashCode()
и equals()
для Bazoo
класса. Это заставит ваш пример кода работать так, как вы хотите.
0 плюса
Другой вариант - положиться на старый добрый equals
метод моды . Пока аргумент в when
mock equals
аргумент в тестируемом коде, Mockito будет соответствовать макету.
Вот пример.
public class MyPojo {
public MyPojo( String someField ) {
this.someField = someField;
}
private String someField;
@Override
public boolean equals( Object o ) {
if ( this == o ) return true;
if ( o == null || getClass() != o.getClass() ) return false;
MyPojo myPojo = ( MyPojo ) o;
return someField.equals( myPojo.someField );
}
}
затем, предполагая, что вы знаете, какое значение someField
будет иметь значение, вы можете сделать это так.
when(fooDao.getBar(new MyPojo(expectedSomeField))).thenReturn(myFoo);
Плюсы: это более явно, чем any
совпадения. Как рецензент кода, я внимательно слежу за any
тем, что пишут младшие разработчики кода, поскольку он просматривает логику своего кода, чтобы сгенерировать соответствующий передаваемый объект.
con: Иногда поле, передаваемое объекту, является случайным идентификатором. В этом случае вы не можете легко создать ожидаемый объект аргумента в вашем фиктивном коде.
Другой возможный подход заключается в использовании Answer
объекта Mockito, который можно использовать с when
методом. Answer
позволяет вам перехватить реальный вызов, проверить входной аргумент и вернуть фиктивный объект. В приведенном ниже примере я использую, any
чтобы перехватить любой запрос к методу. Но затем в Answer
лямбде я могу дополнительно проверить аргумент Базо ... возможно, чтобы убедиться, что ему был передан правильный идентификатор. Я предпочитаю это any
самому себе, чтобы по крайней мере какая-то проверка была сделана по аргументу.
Bar mockBar = //generate mock Bar.
when(fooDao.getBar(any(Bazo.class))
.thenAnswer( ( InvocationOnMock invocationOnMock) -> {
Bazo actualBazo = invocationOnMock.getArgument( 0 );
//inspect the actualBazo here and thrw exception if it does not meet your testing requirements.
return mockBar;
} );
Итак, чтобы подвести итог, я предпочитаю полагаться equals
(где ожидаемый аргумент и фактический аргумент должны быть равны друг другу), и если равенство невозможно (из-за невозможности предсказать фактическое состояние аргумента), я прибегну к чтобы Answer
проверить аргумент.
Вопросы из категории :
- java В чем разница между int и Integer в Java и C #?
- java Как я могу определить IP моего маршрутизатора / шлюза в Java?
- java Каков наилучший способ проверки XML-файла по сравнению с XSD-файлом?
- java Как округлить результат целочисленного деления?
- java Преобразование списка <Integer> в список <String>
- unit-testing Каковы основные различия между TDD и BDD?
- unit-testing В чем разница между интеграционными и модульными тестами?
- unit-testing Как мне проверить приватную функцию или класс, который имеет закрытые методы, поля или внутренние классы?
- unit-testing Куда идут юнит-тесты Python?
- unit-testing Стоит ли тестировать частные методы или только публичные?
- mocking В чем разница между фальсификацией, насмешкой и ступлением?
- mocking Как вы макете файловую систему в C # для модульного тестирования?
- mocking Как я могу издеваться над веб-сервером в Perl?
- mocking Проверьте значение атрибута объекта с помощью mockito
- mocking Возможно ли создать макет объекта, который реализует несколько интерфейсов с помощью EasyMock?
- mockito Как сделать mock to void методами с Mockito
- mockito Инъекция Mockito издевается в бобе Spring
- mockito Как правильно подобрать вараргов в Мокито
- mockito Как проверить, содержит ли параметр две подстроки, используя Mockito?