2015-12-03 3 views
21

У меня есть класс А, который использует 3 классов с различноКак использовать @InjectMocks вместе с @Autowired аннотации в JUnit

автоматического связывания
public class A() { 

    @Autowired 
    private B b; 

    @Autowired 
    private C c; 

    @Autowired 
    private D d; 
} 

Во время тестирования их, я хотел бы иметь только 2 классов (B & C), как издевается и имеют класс D, чтобы быть Autowired в нормальном режиме, этот код не работает для меня:

@RunWith(MockitoJUnitRunner.class) 
public class aTest() { 

    @InjectMocks 
    private A a; 

    @Mock 
    private B b; 

    @Mock 
    private C c; 

    @Autowired 
    private D d; 
} 

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

ответ

21

Это должно быть что-то вроде

@RunWith(SpringJUnit4ClassRunner.class) 
public class aTest() { 

    @Mock 
    private B b; 

    @Mock 
    private C c; 

    @Autowired 
    @InjectMocks 
    private A a; 

} 

Если вы хотите D быть Autowired не нужно делать что-нибудь в вашем Test классе. Ваш AutowiredA должен иметь правильный экземпляр D. Также я думаю, вам нужно использовать SpringJUnit4ClassRunner для Autowiring для работы, с contextConfiguration правильно установить. Поскольку вы не используете MockitoJunitRunner вам необходимо инициализировать mocks самостоятельно, используя

MockitoAnnotations.initMocks (java.lang.Object TestClass)

+0

Есть ли способ, которым я могу продолжать использовать @RunWith (MockitoJUnitRunner.class) и решить эту проблему? приведенный выше код является лишь частью более крупного тестового класса, и я не могу изменить способ запуска junits – USer22999299

+1

Да, вы можете, но в этом случае вы не можете использовать 'Autwired', тогда вам нужно вручную ввести код для инициализации весеннего контекста загрузить экземпляр из 'A' –

+2

Существует случай, когда этот подход не будет работать: когда' A' аннотируется с помощью '@ Transactional' (или имеет методы, аннотированные с помощью' @ Transactional'); см. http://stackoverflow.com/questions/12857981/transactional-annotation-avoids-services-being-mocked и http://stackoverflow.com/questions/21124326/how-to-inject-mock-into-service-that -has-transactional –

2

я столкнулся же проблема, и попытался ответить на Sajan Чандраном , В моем случае это не сработало, потому что я использую аннотацию @SpringBootTest для загрузки только подмножества всех моих компонентов. Цель состоит в том, чтобы не загружать бобы, которые я издеваюсь, поскольку у них много других зависимостей и конфигураций.

И я нашел следующий вариант решения для меня, которое можно использовать и в нормальном случае.

@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); 
    } 

} 
Смежные вопросы