В чем разница между @Mock
и @InjectMocks
в рамках Mockito?
java
unit-testing
mocking
mockito
user2249972
источник
источник
Ответы:
@Mock
создает насмешку@InjectMocks
создает экземпляр класса и внедряет макеты, созданные с@Mock
(или@Spy
) аннотациями в этот экземпляр.Обратите внимание, что вы должны использовать
@RunWith(MockitoJUnitRunner.class)
илиMockito.initMocks(this)
инициализировать эти макеты и вводить их.источник
Это пример кода о том, как
@Mock
и как@InjectMocks
работает.Скажем, у нас есть
Game
иPlayer
класс.Как видите,
Game
класс нужноPlayer
выполнитьattack
.Mockito будет издеваться над классом Player и его поведением, используя метод
when
иthenReturn
метод. И, наконец, использование@InjectMocks
Mockito внесет этоPlayer
вGame
.Обратите внимание, что вам даже не нужно создавать
new Game
объект. Мокито сделает это за тебя.Мы также получим то же самое поведение, используя
@Spy
аннотацию. Даже если имя атрибута другое.Это потому, что Mockito проверит
Type Signature
класс Game, который естьPlayer
иList<String>
.источник
В вашем тестовом классе тестируемый класс должен иметь пометку
@InjectMocks
. Это говорит Mockito, в какой класс вводить макеты:С этого момента мы можем указать, какие конкретные методы или объекты внутри класса в этом случае
SomeManager
будут заменены на mocks:В этом примере
SomeDependency
внутриSomeManager
класса будет издеваться.источник
@Mock
аннотация высмеивает заинтересованный объект.@InjectMocks
аннотация позволяет вводить в базовый объект различные (и соответствующие) макеты, созданные@Mock
.Оба дополняют друг друга.
источник
@InjectMocks
для создания этого класса и шпионить за ним тоже.Например
Здесь нам нужен класс DAO для класса обслуживания. Итак, мы высмеиваем это и внедряем это в экземпляр класса обслуживания. Точно так же в среде Spring все бины @Autowired могут быть смоделированы @Mock в jUnits и внедрены в ваш бин через @InjectMocks.
MockitoAnnotations.initMocks(this)
Метод инициализирует эти макеты и вводит их для каждого тестового метода, поэтому его нужно вызывать вsetUp()
методе.Эта ссылка имеет хороший учебник для фреймворка Mockito
источник
«Среда Mocking», на которой основан Mockito, - это среда, которая дает вам возможность создавать объекты Mock (в старых терминах эти объекты можно называть шунтами, поскольку они работают как шунты для зависимой функциональности) Другими словами, mock Объект используется для имитации реального объекта, от которого зависит ваш код, вы создаете прокси-объект с фреймворком. Используя фиктивные объекты в своих тестах, вы по сути переходите от обычного модульного тестирования к интеграционному тестированию.
Mockito - это среда тестирования с открытым исходным кодом для Java, выпущенная под лицензией MIT, это «среда разработки», которая позволяет писать прекрасные тесты с простым и понятным API. В пространстве Java существует множество различных фреймворков, однако, по сути, существует два основных типа фреймворков для фиктивных объектов: те, которые реализуются через прокси, и те, которые реализуются через переназначение классов.
Инфраструктуры внедрения зависимостей, такие как Spring, позволяют внедрять прокси-объекты без изменения какого-либо кода, фиктивный объект ожидает вызова определенного метода и возвращает ожидаемый результат.
@InjectMocks
Аннотацию пытается инициализировать объект тестирования экземпляра и впрыскивают поля аннотированных с@Mock
или@Spy
в частные поля объекта тестирования.MockitoAnnotations.initMocks(this)
вызов, сбрасывает объект тестирования и повторно инициализирует макеты, так что не забудьте иметь это в вашей@Before
/@BeforeMethod
аннотации.источник
Одно из преимуществ, которое вы получаете с подходом, упомянутым @Tom, заключается в том, что вам не нужно создавать конструкторы в SomeManager и, следовательно, ограничивать клиентов для его создания.
Хорошая практика или нет, зависит от вашего дизайна приложения.
источник
Многие люди дали отличное объяснение здесь о
@Mock
против@InjectMocks
. Мне это нравится, но я думаю, что наши тесты и приложения должны быть написаны таким образом, чтобы нам не нужно было их использовать@InjectMocks
.Ссылка для дальнейшего чтения с примерами: https://tedvinke.wordpress.com/2014/02/13/mockito-why-you-should-not-use-injectmocks-annotation-to-autowire-fields/
источник
@Mock
используется для объявления / макета ссылок зависимых бинов, в то время как@InjectMocks
как используется для макета bean-компонента, для которого создается тест.Например:
тест для класса
A
:источник
Аннотация @InjectMocks может использоваться для автоматической вставки фиктивных полей в тестовый объект.
В приведенном ниже примере @InjectMocks использовал для вставки фиктивного dataMap в dataLibrary.
источник
Обратите внимание, что
@InjectMocks
это должно быть устарелои вы можете следить за ответом @avp и ссылаться на:
источник
Хотя вышеупомянутые ответы покрыты, я только попытался добавить мелкие детали, которые я вижу отсутствующими. Причина, стоящая за ними (почему).
Иллюстрация:
Ссылка
источник