2014-09-17 18 views
5

Quando stavo scrivendo il test case usando Mockito e Junit, stavo usando lo @InjectMocks per la classe da testare. In altre parti del progetto, vedo anche che @Autowired viene utilizzato per la classe da testare.Differenza tra @injectMocks e l'utilizzo @Autowired in mockito?

Quando è possibile utilizzare @InjectMocks e @Autowired? Qual è la differenza tra due quando stiamo cercando di usarli con la classe da testare?

risposta

4

@InjectMocks è un meccanismo per iniettare Mockito campi dichiarati nel prova classe in campi corrispondenti nella classe in prova. Non richiede che la classe sottoposta a test sia un componente Spring.

@Autowired è l'annotazione di Spring per l'autowiring di un bean in una classe di produzione non di test.

Se si voleva sfruttare le @Autowired annotazioni della classe in prova, un altro approccio sarebbe quello di utilizzare springockito che permette di dichiarare i fagioli finta in modo che essi saranno autowired nella classe in prova allo stesso modo che la primavera sarebbe autowire il fagiolo. Ma in genere non è necessario.

+0

+1 come non avevo sentito parlare di springockito che sembra bello e pulito. – dectarin

+0

Springockito è davvero bello, non lo uso mai perché preferisco i test unitari. Tuttavia recentemente (qualche mese fa) ho sentito che springockito aveva alcuni bug. – Brice

6

@InjectMocks l'annotazione dice a Mockito di iniettare tutti i mock (oggetti annotati dall'annotazione @Mock) nei campi dell'oggetto di test. Mockito usa Reflection per questo.

@Autowired l'annotazione indica al framework Spring di iniettare il bean dal suo contenitore IoC. Spring usa anche la riflessione per questo quando si tratta di un'iniezione di campo privata. È persino possibile utilizzare anche l'annotazione @Inject (parte delle specifiche Java EE) con lo stesso effetto.

Ma vorrei suggerire di esaminare i vantaggi di Constructor injection over Field injection. In tal caso non è necessario utilizzare lo @InjectMocks perché è possibile trasferire i mock in oggetto di test tramite il costruttore. Non ci sarebbe stato bisogno di Reflection sotto il cofano nel tuo test né in produzione.

Se si desidera creare test di integrazione con sottoinsieme di bean Spring, suggerirei di dare un'occhiata all'annotazione @DirtiesContext. Fa parte del modulo framework Spring comunemente chiamato "Spring Test".