Подтвердить что ты не робот

Как использовать @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;
}

Возможно ли это сделать?

4b9b3361

Ответ 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);
    }

}