Sto usando le annotazioni @Mock
e @InjectMocks
per iniettare dipendenze in campi privati che sono annotati con Spring’s @Autowired
:
@RunWith(MockitoJUnitRunner.class) public class DemoTest { @Mock private SomeService service; @InjectMocks private Demo demo; /* ... */ }
e
public class Demo { @Autowired private SomeService service; /* ... */ }
Ora vorrei anche iniettare oggetti reali in campi privati @Autowired
(senza setter). È ansible o il meccanismo è limitato all’iniezione di Mock solo?
Usa @Spy
annotazione @Spy
@RunWith(MockitoJUnitRunner.class) public class DemoTest { @Spy private SomeService service = new RealServiceImpl(); @InjectMocks private Demo demo; /* ... */ }
Mockito considererà tutti i campi con annotazione @Mock
o @Spy
come potenziali candidati da inserire nell’istanza annotata con @InjectMocks
annotazione @InjectMocks
. Nel caso precedente l’istanza 'RealServiceImpl'
verrà iniettata nella ‘demo’
Per maggiori dettagli fare riferimento
Mockito-casa
@Spiare
@Mock
In aggiunta alla risposta @Dev Blanked, se si desidera utilizzare un bean esistente creato da Spring, il codice può essere modificato in:
@RunWith(MockitoJUnitRunner.class) public class DemoTest { @Inject private ApplicationContext ctx; @Spy private SomeService service; @InjectMocks private Demo demo; @Before public void setUp(){ service = ctx.getBean(SomeService.class); } /* ... */ }
In questo modo non è necessario modificare il codice (aggiungere un altro costruttore) solo per far funzionare i test.