2015-04-12 12 views
14

si tenta di eseguire questo test:esempio finto è nullo dopo @Mock annotazione

@Mock IRoutingObjHttpClient routingClientMock; 
    @Mock IRoutingResponseRepository routingResponseRepositoryMock; 


    @Test 
    public void testSendRoutingRequest() throws Exception { 
     CompleteRoutingResponse completeRoutingResponse = new CompleteRoutingResponse(); 
     completeRoutingResponse.regression_latencyMillis = 500L; 

     Mockito.when(routingClientMock.sendRoutingRequest(any(RoutingRequest.class))).thenReturn(completeRoutingResponse); 

     RoutingObjHttpClientWithReRun routingObjHttpClientWithReRun = new RoutingObjHttpClientWithReRun 
       (routingClientMock, routingResponseRepositoryMock); 

... 
    } 

ma ottengo NullPointerException per:

Mockito.when(routingClientMock.

Che cosa mi manca?

+1

Chiamate 'MockitoAnnotations.initMocks (this)'? (Probabilmente dovrebbe essere nel metodo @Before) O hai qualche altro @Rule che ti aspetti di inizializzare i tuoi mock? (Non è automagic) –

+0

È necessario creare un'istanza di 'routingClientMock', ad es. 'routingClientMock = Mockito.mock (RoutingObjHtttpClient.class);' –

+0

Puoi anche usare '@RunWith (MockitoJUnitRunner.classe) 'nella classe –

risposta

21

Quando si desidera utilizzare il @Mock annotazione è necessario utilizzare il MockitoJUnitRunner

@RunWith(MockitoJUnitRunner.class) 
public class MockitoTest { 

    @Mock 
    private IRoutingObjHttpClient routingClientMock; 

    @Test 
    public void testSendRoutingRequest() throws Exception { 
     // ... 
    } 

} 

Vedere anche this tutorial.

+0

Non funziona per me restituisce sempre questo errore "dexcache == null (e non è stato possibile trovare alcun valore predefinito, prendere in considerazione l'impostazione della proprietà di sistema" dexmaker.dexcache ")" – pyus13

+0

@ pyus13 Questa dovrebbe essere una nuova domanda con più codice. –

+0

Apprezzo la risposta, penso che il problema era che lo stavo usando in JUnit Test e mentre un certo codice univa qualcuno dal team erroneamente aggiunto dipendenze di implementazione del test creatore dex. Dopo aver rimosso la riga da build.gradle, le cose sono state avviate. Grazie spero che questo salvi il tempo di qualcuno. – pyus13

0
  1. Si dovrebbe usare @RunWith(SpringJUnit4ClassRunner.class) a vostra classe
  2. Dovete chiamare MockitoAnnotations.initMocks(this); nel metodo @Before
+0

perché' @RunWith (SpringJUnit4ClassRunner.class) 'e non' MockitoJUnitRunner.class'? –

19

Sono disponibili tre opzioni per l'attivazione dell'annotazione @Mock. IMHO utilizzando MockitoRule è il migliore, perché ti consente di scegliere un altro corridore come ad es. Parameterized.

Utilizzare il MockitoRule

public class MockitoTest { 

    @Mock 
    private IRoutingObjHttpClient routingClientMock; 

    @Rule 
    public MockitoRule rule = MockitoJUnit.rule(); 

    @Test 
    public void testSendRoutingRequest() throws Exception { 
    // ... 
    } 
} 

Utilizzare il MockitoJUnitRunner

@RunWith(MockitoJUnitRunner.class) 
public class MockitoTest { 

    @Mock 
    private IRoutingObjHttpClient routingClientMock; 

    @Test 
    public void testSendRoutingRequest() throws Exception { 
    // ... 
    } 
} 

chiamata MockitoAnnotations.initMocks(this) esplicitamente. Questo può essere fatto nel metodo qn @Before, nel proprio concorrente o in una propria regola.

public class MockitoTest { 

    @Mock 
    private IRoutingObjHttpClient routingClientMock; 

    @Before 
    public void createMocks() { 
    MockitoAnnotations.initMocks(this); 
    } 

    @Test 
    public void testSendRoutingRequest() throws Exception { 
    // ... 
    } 
} 
+1

Questa è la risposta più completa! –

-1

Se si utilizza anche PowerMock poi

@RunWith(MockitoJUnitRunner.class) 

possono essere sostituiti con

@RunWith(PowerMockRunner.class) 

Questo attiverà la tua @Mocks e attivare la funzionalità PowerMock.

0

Può anche essere un problema di importazione, quindi assicuratevi di avere il pacchetto importato appropriato.

Ad esempio, il pacchetto "org.easymock" ha anche un'annotazione chiamata @Mock, che ovviamente non funzionerà con l'installazione specifica di Mockito.