it-swarm.com.ru

Может ли Мокито заглушить метод без учета аргумента?

Я пытаюсь протестировать некоторый унаследованный код, используя Mockito.

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

foo = fooDao.getBar(new Bazoo());

Я могу написать:

when(fooDao.getBar(new Bazoo())).thenReturn(myFoo);

Но очевидная проблема заключается в том, что getBar() никогда не вызывается с тем же объектом Bazoo, для которого я обозначил метод. (Прокляните, что оператор new!)

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

259
Eric Wilson
when(
  fooDao.getBar(
    any(Bazoo.class)
  )
).thenReturn(myFoo);

или (чтобы избежать nulls):

when(
  fooDao.getBar(
    (Bazoo)notNull()
  )
).thenReturn(myFoo);

Не забудьте импортировать совпадения (доступно много других):

Для Mockito 2.1.0 и новее:

import static org.mockito.ArgumentMatchers.*;

Для более старых версий:

import static org.mockito.Matchers.*;
399
Tomasz Nurkiewicz

Используйте как это:

when(
  fooDao.getBar(
    Matchers.<Bazoo>any()
  )
).thenReturn(myFoo);

Прежде чем вам нужно импортировать Mockito.Matchers

15
user3975308

http://site.mockito.org/mockito/docs/1.10.19/org/mockito/Matchers.html

anyObject должен соответствовать вашим потребностям.

Кроме того, вы всегда можете рассмотреть реализацию hashCode и equals для класса Bazoo. Это заставит ваш пример кода работать так, как вы хотите.

12
Buhb