Я использую Mockito @Mock
и @InjectMocks
аннотации для вставки зависимостей в частные поля, которые отмечены Spring @Autowired
:
@RunWith(MockitoJUnitRunner.class)
public class DemoTest {
@Mock
private SomeService service;
@InjectMocks
private Demo demo;
/* ... */
}
и
public class Demo {
@Autowired
private SomeService service;
/* ... */
}
Теперь я хотел бы также вводить реальные объекты в частные @Autowired
поля (без установщиков). Это возможно, или механизм ограничен только инъекциями?
MockitoAnnotations.initMocks(this);
в@Before
методе. Я знаю, что это не имеет прямого отношения к первоначальному вопросу, но для любого, кто придет позже, это нужно добавить, чтобы сделать его работоспособным.@RunWith(MockitoJUnitRunner.class)
), вам не нужна строкаMockitoAnnotations.initMocks(this);
Ответы:
Используйте
@Spy
аннотациюMockito будет рассматривать все поля, имеющие
@Mock
или@Spy
аннотацию в качестве потенциальных кандидатов, которые будут введены в экземпляр, помеченный@InjectMocks
аннотацией. В приведенном выше случае'RealServiceImpl'
экземпляр будет введен в «демо»Для более подробной информации обратитесь
Mockito-дом
@Spy
@Mock
источник
Mockito cannot mock/spy following: - final classes - anonymous classes - primitive types
new RealServiceImpl()
,@Spy private SomeService service;
создает реальный объект , используя конструктор по умолчанию , прежде чем шпионить это в любом случае.В дополнение к бланковому ответу @Dev, если вы хотите использовать существующий компонент, созданный Spring, код можно изменить на:
Таким образом, вам не нужно менять код (добавлять другой конструктор) только для того, чтобы тесты работали.
источник
Autowired
поля из зависимостей были созданы правильно.Mockito - это не DI-фреймворк, и даже DI-фреймворки поощряют инжекторы конструктора поверх полевых.
Таким образом, вы просто объявляете конструктор для установки зависимостей тестируемого класса:
Использование Mockito
spy
для общего случая - ужасный совет. Это делает тестовый класс ломким, а не прямым и подверженным ошибкам: что на самом деле насмехается? Что действительно проверено?@InjectMocks
а@Spy
также вредит общему дизайну, так как он поощряет раздутые классы и смешанные обязанности в классах.Пожалуйста, прочитайте
spy()
Javadoc, прежде чем использовать это вслепую (акцент не мой):источник
Весной
ReflectionTestUtils
для этой цели существует специальная утилита . Возьмите конкретный экземпляр и введите в поле.источник
Я знаю, что это старый вопрос, но мы столкнулись с той же проблемой при попытке ввести строки. Поэтому мы изобрели расширение JUnit5 / Mockito, которое делает именно то, что вы хотите: https://github.com/exabrial/mockito-object-injection
РЕДАКТИРОВАТЬ:
источник