Я пытаюсь протестировать старый код, используя Mockito.
Я хочу заглушить, FooDao
что используется в производстве следующим образом:
foo = fooDao.getBar(new Bazoo());
Я могу написать:
when(fooDao.getBar(new Bazoo())).thenReturn(myFoo);
Но очевидная проблема заключается в том, что getBar()
никогда не вызывается с тем же Bazoo
объектом, для которого я обозначил метод. (Прокляни этого new
оператора!)
Мне бы понравилось, если бы я мог заглушить метод таким образом, чтобы он возвращался myFoo
независимо от аргумента. Если это не удастся, я выслушаю другие предложения по обходному пути, но я действительно хотел бы избежать изменения производственного кода до тех пор, пока не будет разумного покрытия тестами.
источник
notNull(Bazoo.class)
что-то вродеany(Bazoo.class)
(может быть, его не было на момент ответа)Bazoo
илиCazoo
которые являются подклассами, скажем,Azoo
. потому чтоBazoo
мне нужно было вернутьсяfoo
, ноCazoo
мне нужно было вернутьсяbar
. в этой ситуации предлагаемоеMatchers.any()
решение не работает, однакоMatchers.isA()
работает отлично.org.mockito.Matchers
теперь устарела - используйтеorg.mockito.ArgumentMatchers
вместо этого, т.е.import static org.mockito.ArgumentMatchers.*
(см. документы )when(myFoo.knowsWhatsUp()).thenReturn(myMoney);
Используйте как это:
Прежде чем вам нужно импортировать
Mockito.Matchers
источник
http://site.mockito.org/mockito/docs/1.10.19/org/mockito/Matchers.html
anyObject()
должно соответствовать вашим потребностям.Также вы всегда можете рассмотреть возможность реализации
hashCode()
иequals()
дляBazoo
класса. Это заставит ваш пример кода работать так, как вы хотите.источник
Другой вариант - положиться на старый добрый
equals
метод моды . Пока аргумент вwhen
mockequals
аргумент в тестируемом коде, то Mockito будет соответствовать макету.Вот пример.
затем, предполагая, что вы знаете, какое значение
someField
будет иметь значение, вы можете сделать это так.Плюсы: это более явно, чем
any
совпадения. Как рецензент кода, я внимательно слежу заany
тем, что пишут младшие разработчики кода, поскольку он просматривает логику своего кода, чтобы сгенерировать соответствующий передаваемый объект.con: Иногда поле, передаваемое объекту, является случайным идентификатором. В этом случае вы не можете легко создать ожидаемый объект аргумента в вашем фиктивном коде.
Другой возможный подход - использовать
Answer
объект Mockito, который можно использовать сwhen
методом.Answer
позволяет вам перехватить реальный вызов, проверить входной аргумент и вернуть фиктивный объект. В приведенном ниже примере я использую,any
чтобы перехватить любой запрос к методу. Но затем вAnswer
лямбде я могу дополнительно проверить аргумент Базо ... может быть, чтобы убедиться, что ему был передан правильный идентификатор. Я предпочитаю этоany
самому себе, чтобы по крайней мере какая-то проверка была сделана по аргументу.Итак, чтобы подвести итог, я предпочитаю полагаться
equals
(где ожидаемый аргумент и фактический аргумент должны быть равны друг другу), и если равенство невозможно (из-за невозможности предсказать состояние фактического аргумента), я прибегну к чтобыAnswer
проверить аргумент.источник