2013-01-22 14 views
6

Sto provando a prendere in giro un metodo privato con mockito/powermock. Ottengo NullPointerException
Il semplice esempio che sto cercando di fare è:Ottieni java.lang.NullPointerException quando provi a prendere in giro il metodo privato con mockito e powermock

classe reale

import com.siriusforce.plugin.common.PluginSystem; 
import com.wellsfargo.core.business.service.dp.fulfillment.MockitoBusinessService; 

public class MockitoBusinessOperationImpl implements MockitoBusinessOperation{ 
    private MockitoBusinessService mockitoBusinessService = PluginSystem.INSTANCE.getPluginInjector().getInstance(MockitoBusinessService.class); 
    private Long Id; 

    public String creditAproved(Long Id){ 
     System.out.println("Came Inside MockitoBusinessOperationImpl"); 
     this.Id = Id; 
     if (this.Id != null){ 
      System.out.println("Inside creditaproved If statement"); 
      String Report = mockitoBusinessService.creditReport(this.Id); 
      System.out.println("Mock Object Injected from test class "+ Report); 
      return Report; 
     } else 
      return "Went to Else Part"; 
    } 

    private String inTestMethod(Long Id){ 
     return "this is working"; 
    } 
} 

Classe di prova:

import static org.mockito.Mockito.spy; 
import static org.mockito.Mockito.when; 
import static org.powermock.api.mockito.PowerMockito.doReturn; 

import org.mockito.InjectMocks; 
import org.mockito.Mock; 
import org.mockito.MockitoAnnotations; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.testng.annotations.BeforeMethod; 
import org.testng.annotations.Test; 

import com.siriusforce.plugin.common.PluginSystem; 

public class MockitoBusinessServiceTest { 

    @Mock 
    MockitoBusinessService MockitoBusinessService ; 

    @InjectMocks  
    private MockitoBusinessOperation MockitoBusinessOperation = PluginSystem.INSTANCE.getPluginInjector().getInstance(MockitoBusinessOperation.class); 

    private Long Id; 

    @BeforeMethod 
    public void init() { 
     MockitoAnnotations.initMocks(this); 
     this.Id = 123L; 
    } 

    @PrepareForTest(MockitoBusinessOperation.class) 
    @Test(enabled = true) 
    public void testReCalculatePrepaids() throws Exception { 
     MockitoBusinessOperation = spy(MockitoBusinessOperation); 
     doReturn("this will work hopefully").when(MockitoBusinessOperation, "inTestMethod", this.Id); 

     when(MockitoBusinessService.creditReport(this.Id)).thenReturn(new String("Decline by only Me")); 

     String mainReport = MockitoBusinessOperation.creditAproved(this.Id); 
     System.out.println("Indirect Call from actual class MainReport " + mainReport); 

    } 
} 

Quando provo a fare funzionare questo ho a NullPointerException: qualsiasi suggerimento che risolva questo o qualsiasi altro modo di deridere un metodo privato. Non voglio usare il suggerimento dato per rendere il metodo protetto che significa cambiare il metodo attuale. Non voglio alcuna modifica l'attuale

class method 
    <failure type="java.lang.NullPointerException">java.lang.NullPointerException 

at org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.addAnswersForStubbing(PowerMockitoStubberImpl.java:68) 

at org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.prepareForStubbing(PowerMockitoStubberImpl.java:123) 

at org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.when(PowerMockitoStubberImpl.java:91) 

at com.wellsfargo.core.business.service.dp.fulfillment.MockitoBusinessServiceTest.testReCalculatePrepaids(MockitoBusinessServiceTest.java:54) 

+1

ho dato la NullPointerException: semplicemente aggiungendo PowerMockito al metodo spia. 'MockitoBusinessOperation = PowerMockito.spy (MockitoBusinessOperation);' Ora il problema è prendere in giro il metodo privato anche se ho preso in giro il metodo privato ma sta ancora ricevendo una chiamata. [In un altro post] (http://stackoverflow.com/questions/8057607/when-mocking-private-method-with-powermock-but-underlying-method-still-gets-cal?rq=1) qualcuno ha postato questo problema. ma la soluzione non sta funzionando per me. qualsiasi suggerimento perché la finta non viene riflessa come suppone di essere. – jan

+0

Stai usando lo stile di scrittura doWhen()? Puoi pubblicare un nuovo esempio di codice o modificare la tua domanda? –

risposta

11

È necessario utilizzare PowerMockito.spy() invece di Mockito.spy()!

tenta di importare static org.powermock.api.mockito.PowerMockito.spy;