2017-02-08 9 views
3

У меня есть проект загрузки Spring, в котором есть набор модульных тестов, в которых используются @InjectMocks mockito для создания экземпляра тестируемого класса и ввода любых макетов, которые могут присутствовать в нем.@Autowire в сочетании с @InjectMocks

Другими словами, если у меня есть этот

@InjectMocks MyClass MyClass;

Тогда мне не нужно

MyClass MyClass = New MyClass();
или @Autowired MyClass myClass;

До сих пор эта настройка работала нормально.

Однако в последнее время стало необходимо иметь доступ к свойствам весенней загрузки проектов при выполнении тестов. Это означает, что необходимо было использовать run-run SpringBoot внутри тестов, чтобы работать с любыми экземплярами @Autowire (включая те, которые создают экземпляр класса Environment).

Я обнаружил, что если @InjectMocks используется для создания экземпляра класса, то любые экземпляры @Autowired внутри класса не работают (объект, который они должны создать, равен нулю). Это означает отсутствие класса среды и доступ к свойствам Spring.

Вместо я должен добавить @Autowired к @InjectMocks аннотацию

так это

@InjectMocks MyClass MyClass;

становится этим

@Autowired
@InjectMocks MyClass MyCLASS;

Мой вопрос прост. Есть ли что-то не так с этим? Двойной экземпляр myClass или все, что может вызвать сбои

ответ

4

Я думаю, вы смешиваете аннотации, принадлежащие весне, и те, которые принадлежат к Mockito.

При запуске своего веб-приложения @Autowired предоставит вашему классу определенную зависимость. Таким образом, вам не нужно вручную создавать объекты с ключевым словом new. Но во время выполнения, это только весенние аннотации, которые играют. Аннотации mockito не предназначены для этого варианта использования.

Когда вы запускаете тесты, это наоборот. Теперь весенние аннотации ничего не сделают, это аннотации mockito, которые работают. @InjectMocks скажет mockito: «Все, что я предоставил с @Mock, и это необходимо для этого класса, просто вставьте его туда». Он сделает это, даже если вы не положили @Autowired в это поле. Мокито не волнует весенние аннотации.

За ваш вопрос: я не вижу вариант использования, где вы бы поставили @Autowired и @InjectMocks в одном и том же месте. Используйте весенние аннотации в логике вашего приложения и аннотации mockito в своих тестах.

Я знаю, что ответ довольно абстрактен, но так ваш вопрос. Чтобы получить более конкретную помощь, вы должны предоставить a minimal, complete and verifiable example.