2013-05-15 3 views
17

Hey Ich versuche, einige Tests für meine JSF-Anwendung und für die Mocks, die ich benutze Mockito. (Ich benutze Frühling auch)Mockito Mock-Objekte gibt 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()); 
    } 
} 

Der Test erfolgreich ist, aber wenn ich die Instanz mit dem getInstance Methode abrufen möchten. Alle Parameter, die ich vorher gesetzt habe (über den Konstruktor vorher), sind null. Ich bin neu bei verspotteten Objekten, also ist dieses Verhalten normal oder gibt es einen Fehler in meinem Code?

+0

Dies scheint nicht im Zusammenhang mit Spott zu sein, da Sie das fragliche Objekt nicht verspotten. –

Antwort

14

Es hängt wirklich von GeneralConfigService # GetInstance() Implementierung ab. Außerdem können Sie Ihren Testcode viel vereinfachen, wenn Sie @InjectMocks Annotation verwenden.

Wenn MockitoJUnitRunner verwenden Sie müssen nicht Mocks initialisieren und Ihre Abhängigkeiten manuell zu injizieren:

@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

Einfach hier verlassen: https://tedvinke.wordpress.com/2014/02/13/mockito-why-you-should-not-use-injectmocks-annotation-to-autowire-fields/ –

3

Alle Methodenaufrufe Mockito Mocks standardmäßig null zurück. Wenn Sie möchten, dass es etwas anderes zurückgibt, müssen Sie es über eine when Anweisung dazu sagen.

Es scheint die Sie denken, dass die folgenden arbeiten ... Sie rufen setInstance und dann getInstance erwarten den Wert zurückzugeben, die zu setInstance übergeben wurde, da dies ist, wie die DAO funktionieren würde. Wenn dies das ist, was Sie versuchen, sollten Sie setInstance nicht testen, indem Sie getInstance aufrufen, da getInstance zurückgeben wird, was auch immer Sie den Schein für die Rückgabe konfiguriert haben, und keine Beziehung zu dem, was an setInstance übergeben wurde. Verwenden Sie stattdessen verify, um zu bestätigen, dass die entsprechende Methode der DAO aus der setInstance-Methode aufgerufen wurde.

Zum Beispiel, wenn GeneralConfigService.setInstance Anrufe GeneralConfigDAO.setInstance dann Ihren Test so ...

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

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

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

auch aussehen sollte, wenn gen ein Mock (via @Mock) ist, warum Sie es auf etwas anderes über gen = createGeneralConfigs...

zuweisen
6

vergessen Sie nicht,

MockitoAnnotations.initMocks(this); 

Wenn Sie obje Mocking sind zu verwenden, ct through annotation, d. h. @Mock Objectname

+1

initMocks ist nicht erforderlich, wenn mit dem Mockito JUnit Runner. –

+0

Danke für den Kommentar. Wie auch immer ich glaube ... –

+0

heute verwende ich Mock in einer Hauptklasse. ja ~ – Tiina