2013-05-15 25 views
17

Ehi provo a implementare alcuni test per la mia applicazione jsf e per i mock sto usando mockito. (Io uso anche primavera)Mockito mock oggetti restituisce null

@RunWith(MockitoJUnitRunner.class) 
public class GeneralConfigServiceImplTest { 

    private GeneralConfigService generalConfigService; 

    @Mock 
    private GeneralConfigDAO generalConfigDAO; 

    @Mock 
    private GeneralConfig gen; 

    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
     generalConfigService = new GeneralConfigService(); 
     ReflectionTestUtils.setField(generalConfigService, "generalConfigDAO", generalConfigDAO);     
    } 

    @Test 
    public void testAddGeneralConfigCallDAOSuccess() throws DAOException, EntityNullException, IllegalEntityArgumentException, ParseException, EntityPersistException { 
     gen = createGeneralConfigs("label", "value"); 

     generalConfigService.setInstance(gen); 
     generalConfigService.persist(); 
     log.info(generalConfigService.getInstance().toString()); 
    } 
} 

Il test ha esito positivo, ma quando voglio recuperare l'istanza con il metodo getInstance. Tutti i parametri che ho impostato prima (tramite il costruttore prima) sono nulli. Sono nuovo agli oggetti derisi, quindi questo comportamento è normale, oppure c'è un errore nel mio codice?

+0

Questo non sembra essere correlato al mocking in quanto non si prende in giro l'oggetto in questione. –

risposta

14

Dipende veramente dall'implementazione di GeneralConfigService # getInstance(). Inoltre è possibile semplificare molto il codice di test se si utilizza l'annotazione @InjectMocks.

Quando si utilizza MockitoJUnitRunner non è necessario inizializzare schernisce e iniettare le dipendenze manualmente:

@RunWith(MockitoJUnitRunner.class) 
public class GeneralConfigServiceImplTest { 

    @InjectMocks 
    private GeneralConfigService generalConfigService; 

    @Mock 
    private GeneralConfigDAO generalConfigDAO; 

    @Test 
    public void testAddGeneralConfigCallDAOSuccess() { 
     // generalConfigService is already instantiated and populated with dependencies here 
     ... 
    } 
} 
+0

Basta lasciare questo qui: https://tedvinke.wordpress.com/2014/02/13/mockito-why-you-should-not-use-injectmocks-annotation-to-autowire-fields/ –

3

Tutte le chiamate di metodo per Mockito prende in giro restituiscono null per impostazione predefinita. Se vuoi che restituisca qualcos'altro, devi dirgli di farlo tramite una dichiarazione when.

Sembra che la si sta pensando che il seguente funziona ... si chiama setInstance e poi aspettate getInstance per restituire il valore che è stato passato a setInstance dal momento che questo è il modo in DAO avrebbe funzionato. Se questo è quello che stai tentando, non dovresti provarechiamando getInstance dal momento che il getInstance restituirà qualsiasi cosa tu abbia configurato il mock da restituire e non avrà alcuna relazione con ciò che è stato passato a setInstance. Utilizzare invece verify per verificare che il metodo appropriato di DAO sia stato chiamato dal metodo setInstance.

Per esempio, se GeneralConfigService.setInstance chiamate GeneralConfigDAO.setInstance quindi il test dovrebbe essere simile a questo ...

@Test 
public void testAddGeneralConfigCallDAOSuccess() throws DAOException, EntityNullException, IllegalEntityArgumentException, ParseException, EntityPersistException { 
gen = createGeneralConfigs("label", "value"); 

generalConfigService.setInstance(gen); 
generalConfigService.persist(); 

verify(genConfigDAO).setInstance(sameInstance(gen)); 
} 

Inoltre, se gen è un finto (via @Mock) perché stai assegnandolo ad altro tramite gen = createGeneralConfigs...

6

non dimenticare di utilizzare

MockitoAnnotations.initMocks(this); 

Se si beffardo obje ct through annotation, ad esempio @Mock Objectname

+1

initMocks non è richiesto quando usando il corridore di Mockito JUnit. –

+0

Grazie per il commento. Ad ogni modo credo ... –

+0

oggi sto usando finto in una classe principale. sì ~ – Tiina

Problemi correlati