Как использовать @InjectMocks вместе с @Autowired аннотацией в Junit
У меня есть класс A, который использует 3 разных класса с autowiring
public class A () {
@Autowired
private B b;
@Autowired
private C c;
@Autowired
private D d;
}
При тестировании я хотел бы иметь только 2 класса (B и C) как mocks и иметь класс D для Autowired как обычный запуск, этот код не работает для меня:
@RunWith(MockitoJUnitRunner.class)
public class aTest () {
@InjectMocks
private A a;
@Mock
private B b;
@Mock
private C c;
@Autowired
private D d;
}
Возможно ли это сделать?
Ответы
Ответ 1
Это должно быть что-то вроде
@RunWith(SpringJUnit4ClassRunner.class)
public class aTest () {
@Mock
private B b;
@Mock
private C c;
@Autowired
@InjectMocks
private A a;
}
Если вы хотите, чтобы D
был Autowired
, не нужно ничего делать в своем классе Test
. Ваш Autowired
A
должен иметь правильный экземпляр D
.
Также я думаю, вам нужно использовать SpringJUnit4ClassRunner
для Autowiring
для работы, с contextConfiguration
установить правильно.
Поскольку вы не используете MockitoJunitRunner
, вам нужно инициализировать свой mocks
самостоятельно, используя
MockitoAnnotations.initMocks(java.lang.Object testClass)
Ответ 2
Я столкнулся с такой же проблемой и попробовал ответить Саджан Чандран. В моем случае это не сработало, потому что я использую аннотацию @SpringBootTest для загрузки только подмножества всех моих beans. Цель состоит не в загрузке beans, который я издеваюсь, поскольку у них много других зависимостей и конфигураций.
И я нашел следующий вариант решения для меня, который можно использовать и в нормальном случае.
@RunWith(SpringRunner.class)
@SpringBootTest(classes={...classesRequired...})
public class aTest () {
@Mock
private B b;
@Mock
private C c;
@Autowired
@Spy
private D d;
@InjectMocks
private A a;
@Before
public void init(){
MockitoAnnotations.initMocks(this);
}
}
Ответ 3
Если вы хотите остаться с аннотацией mockito, вы можете использовать @Spy следующим образом:
https://dzone.com/articles/use-mockito-mock-autowired