2013-12-11 15 views
10

Sto usando mockito come quadro di derisione. Ho uno scenerio qui, il mio quando (abc.method()). ThenReturn (valore) non restituisce valore, invece restituisce null.Mockito quando il metodo non funziona

public class DQExecWorkflowServiceImplTest { 
@InjectMocks 
DQExecWorkflowServiceImpl dqExecWorkflowServiceImpl = new DQExecWorkflowServiceImpl(); 
@Mock 
private DQUtility dqUtility; 
@Mock 
private DqExec dqExec; 
@Mock 
private DqCntlDefn dqCntlDefn; 
@Mock 
private DqCntlWfDefn dqCntlWfDefn; 
@Mock 
private DqCntlWfDefnTyp dqCntlWfDefnTyp; 
@Mock 
private IDQControlWfDefTypeService controlWfDefTypeService; 

@Before 
public void setUp() throws Exception { 
    dqExec = new DqExec(); 
    dqCntlWfDefn = new DqCntlWfDefn(); 
    dqUtility = new DQUtility(); 
    dqCntlWfDefnTyp = new DqCntlWfDefnTyp(); 
    dqCntlWfDefnTyp.setDqCntlWfDefnTypCd("MIN_INCLUSIVE_VAL"); 
    dqExecWorkflowServiceImpl 
      .setControlWfDefTypeService(controlWfDefTypeService); 

} 

@Test 
public void testExecuteWorkflow() { 
    when(controlWfDefTypeService.getDqCntlWfDefnTypCd(dqCntlWfDefn)) 
      .thenReturn(dqCntlWfDefnTyp); 
    dqExecWorkflowServiceImpl.executeWorkflow(dqExec, dqCntlWfDefn); 
} 

}

classe Java

@Override 
public DqCntlWfExec executeWorkflow(final DqExec dqExec, 
     final DqCntlWfDefn dqCntlWfDefn) { 
final DqCntlWfExec dqCntlWfExec = new DqCntlWfExec(); 
dqCntlWfExec.setDqCntlWfExecEffDt(dqUtil.getDefaultEffectiveDt()); 
dqCntlWfExec.setDqCntlWfExecExpDt(dqUtil.getDefaultExpiryDt()); 
dqCntlWfExec.setDqCntlWfDefn(dqCntlWfDefn); 
dqCntlWfExec.setDqExec(dqExec); 

final DqCntlWfDefnTyp dqCntlWfDefnTyp = controlWfDefTypeService 
    .getDqCntlWfDefnTypCd(dqCntlWfDefn); 
    String workflowType = null; 
if(null!=dqCntlWfDefnTyp){ 
    workflowType = dqCntlWfDefnTyp.getDqCntlWfDefnTypCd(); 
} 

Quando mai ho eseguito il file di test il cui non funziona e sto usando vaso mockito1.8.5 nel buildpath. La chiamata di servizio viene derisa ma restituisce il valore nullo.

final DqCntlWfDefnTyp dqCntlWfDefnTyp = controlWfDefTypeService 
    .getDqCntlWfDefnTypCd(dqCntlWfDefn); 

Questa dqCntlWfDefnTyp oggetto è nullo

ho fatto prima e non c'era alcun problema con il momento, sembra di poter lavorare con i file che ho fatto prima. Avevo seguito la stessa procedura per il file di test ma non riuscivo a capire il problema. Qualcuno può aiutarmi

Grazie a tutte le persone in anticipo

+14

Provare a ridurre questo ad un esempio più piccolo, è piuttosto illeggibile. E spero davvero che quei nomi non siano sotto il tuo controllo, perché semplicemente non ci sono scuse per "setDqCntlWfExecEffDt". Nota in particolare quanto il codice è incoerente se utilizzare o meno un'abbreviazione: 'setDqCntlWfExecEffDt' vs' getDefaultEffectiveDt', 'executeWorkflow' vs' DqCntlWfExec', ecc. Seriamente, il codice potrebbe essere inviato a TheDailyWTF così com'è. –

+0

Il codice è stato rifattorizzato e reso leggibile – Gopinathan

+0

È possibile aggiungere l'errore/l'output? Come fai a sapere che è "null"? Lo stai deducendo da 'workflowType' ... potrebbe essere così?getDqCntlWfDefnTypCd() 'sta restituendo' null'? Ecc ... FWIW, penso che il codice originale possa contenere la chiave per questo. :-) – Jonathan

risposta

9

Mockito opere finte quando ci prendiamo in giro gli oggetti liberamente.

Qui è il cambiamento che ho fatto per farlo funzionare:

when(controlWfDefTypeService.getDqCntlWfDefnTypCd(any(DqCntlWfDefn.class)) 
    .thenReturn(dqCntlWfDefnTyp); 

Invece di passare l'oggetto della classe Mock, ho passato la classe con il Matcher any() e funziona.

2

Penso di aver trovato il problema, ma non tutto il merito va a me.

Poiché si sta tentando di simulare "dqCntlWfDefnTyp" nella classe di test e l'oggetto stesso viene istanziato nella classe che si sta tentando di testare, si riscontrano inevitabilmente alcuni problemi. Il problema principale è che l'oggetto non può essere deriso perché viene ricreato durante il test.

Ci sono alcune opzioni, ma a mio modesto parere la scelta migliore è usare PowerMockito. Sarai in grado di sostituire l'oggetto all'interno della classe che viene testata con quello che stai prendendo in giro.

Un eccellente esempio di questo uso di PowerMockito da @raspacorp su questo question:

public class MyClass { 
void method1{ 
    MyObject obj1=new MyObject(); 
    obj1.method1(); 
} 
} 

E la classe di test ...

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MyClass.class) 
public class MyClassTest { 
@Test 
public void testMethod1() {  
    MyObject myObjectMock = mock(MyObject.class); 
    when(myObjectMock.method1()).thenReturn(<whatever you want to return>); 
    PowerMockito.whenNew(MyObject.class).withNoArguments().thenReturn(myObjectMock); 

    MyClass objectTested = new MyClass(); 
    objectTested.method1(); 

    ... // your assertions or verification here 
} 
} 
1

Ho avuto lo stesso problema. La soluzione per me era di mettere il Mockito.quando (...). ThenReturn (...); nel metodo @ Before-SetUp.

Problemi correlati