2012-01-31 14 views
32

Attualmente sto studiando il framework Mockito e ho creato diversi casi di test utilizzando Mockito. Ma poi ho letto che invece di invocare finta (SomeClass .class) posso usare il @Mock e @InjectMocks - L'unica cosa che devo fare è di annotare la mia classe di test con @RunWith(MockitoJUnitRunner.class) o utilizzare il MockitoAnnotations.initMocks(this); nel metodo @Before.Utilizzo di @Mock e @InjectMocks

Ma non funziona - Sembra che lo @Mock non funzioni! Ecco le mie 2 revisioni di codici: uno che utilizza le annotazioni e uno senza.

Cosa sto sbagliando?

public class ReportServiceImplTestMockito { 

    private TaskService  mockTaskService; // This is the Mock object 
    private ReportServiceImpl service; 

    @Before 
    public void init(){ 
     service   = new ReportServiceImpl(); 
     mockTaskService = mock(TaskServiceImpl.class); 
     service.setTaskServiceImpl(mockTaskService); 
    } 
/// ... 

Some tests 
} 

Come ho detto, questo funziona benissimo. Ma il seguente wont:

@RunWith(MockitoJUnitRunner.class) 
public class ReportServiceImplTestMockito { 

    @Mock 
    private TaskService  mockTaskService; 

    @InjectMocks 
    private ReportServiceImpl service; 

     // Some tests 
} 

E qui è la classe ReportServiceImpl:

@Service 
public class ReportServiceImpl implements ReportService { 

    @Autowired 
    private TaskService taskServiceImpl; 

    public ReportServiceImpl(){} 

    public ReportServiceImpl(TaskService taskService){ 
     this.taskServiceImpl = taskService; 
    } 

    public void setTaskServiceImpl(TaskService taskServiceImpl) { 
     this.taskServiceImpl = taskServiceImpl; 
    } 
} 

Che cosa mi manca?

+0

Mi sembra OK, a prima vista. Cosa ti sta male esattamente? –

+1

@Noam Sei sicuro di utilizzare le importazioni corrette? – Brice

+0

David - Ricevo una NullPointerException. E Brice, credo che sto usando le giuste importazioni - qui sono 'import org.jmock.auto.Mock; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.MockitoAnnotations; import org.mockito.runners.MockitoJUnitRunner; ' – Noam

risposta

24

O.K, ho ottenuto il mio errore !!! Ho usato lo @InjectMocks ma ho inizializzato la stessa variabile nel metodo init() ... Quindi quello che è successo è che il mockito ha iniettato gli oggetti finti alla mia variabile - ma pochi secondi dopo l'ho eseguito - inizializzando quella stessa variabile! !!

3

non sono sicuro, ma cercare di creare una nuova istanza di ReportServiceImpl manualmente (come avete fatto nel esempio di lavoro):

@InjectMocks 
private ReportServiceImpl service = new ReportServiceImpl(); 
+3

Questo non è più necessario dal momento che Mockito 1.9 ad eccezione del caso limite. – Brice

+1

Se si utilizza 1.8, è necessario istanziarlo nell'inizializzatore o nel costruttore, a meno che non si utilizzi 'MockitoAnnotations.initMocks (this)' nel qual caso, è necessario creare un'istanza prima che venga chiamato. – jhericks

+3

Innanzitutto, grazie per le risposte. ma l'utilizzo di MockitoAnnotations.initMocks (this) non è necessario poiché ho usato @RunWith (MockitoJUnitRunner.class). – Noam

12

Il tuo codice funziona bene per me usando Mockito 1.9.

Utilizzando una versione 1.8+ di Mockito ottengo un messaggio di errore molto specifico che mi dice esattamente come risolvere il problema. Come suggerisce php-coder: per Mockito 1.8+ è necessario inizializzare il campo.

Hai visualizzato questo o altri messaggi di errore?

Edit:

Il seguente codice funziona per me. Piccoli cambiamenti:

  • annotazioni primavera rimossi
  • rimossi interfaccia
  • Aggiunto Getter
  • Aggiunto TaskService
  • prova vuota Aggiunto con System.out.println

Ha produce un errore per te? :

servizio:

public class ReportServiceImpl { 

    private TaskService taskServiceImpl; 


    public ReportServiceImpl() { 

    } 


    public ReportServiceImpl(TaskService taskService) { 
     this.taskServiceImpl = taskService; 
    } 


    public void setTaskServiceImpl(TaskService taskServiceImpl) { 
     this.taskServiceImpl = taskServiceImpl; 
    } 


    public TaskService getTaskServiceImpl() { 
     return taskServiceImpl; 
    } 
} 

Dipendenza:

public class TaskService { 

} 

di prova, stampe mockTaskService:

@RunWith(MockitoJUnitRunner.class) 
public class ReportServiceImplTestMockito { 

    @Mock 
    private TaskService  mockTaskService; 

    @InjectMocks 
    private ReportServiceImpl service; 


    @Test 
    public void testMockInjected() { 
     System.out.println(service.getTaskServiceImpl()); 
    } 
} 
+0

Ciao, sto usando anche Mockito 1.9 ... – Noam

+1

Come ho detto, il codice funziona per me. Puoi testare il codice che ho postato (solo piccole modifiche)? –

+0

Ciao Arend, scusami per il ritardo - ma il tuo codice funziona anche per me, ho usato una importazione usuale per l'annotazione @Mock - import org.mockito.MockitoAnnotations; invece di import org.mockito.Mock; – Noam

Problemi correlati