web-dev-qa-db-fra.com

Mockito mock objects renvoie null

J'essaie de mettre en œuvre des tests pour mon application JSF et pour les simulations que j'utilise mockito. (J'utilise aussi le printemps)

@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());
    }
}

Le test réussit, mais quand je veux récupérer l'instance avec la méthode getInstance. Tous les paramètres que j'ai définis auparavant (via le constructeur avant) sont nuls. Je suis nouveau dans les objets moqués, est-ce que ce comportement est normal ou y a-t-il une erreur dans mon code?

20
flo8433

Cela dépend vraiment de l'implémentation de GeneralConfigService # getInstance (). Vous pouvez également simplifier considérablement votre code de test si vous utilisez @InjectMocks annotation.

Lorsque vous utilisez MockitoJUnitRunner, vous n'avez pas besoin d'initialiser les mocks et d'injecter vos dépendances manuellement:

@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
       ...
    }
}
17
hoaz

N'oubliez pas d'utiliser

MockitoAnnotations.initMocks(this);

Si vous êtes un objet moqueur par le biais d'annotations, c'est-à-dire @Mock Objectname

9
Swarit Agarwal

Tous les appels de méthode à Mockito mocks renvoient null par défaut. Si vous voulez qu'il retourne autre chose, vous devez lui dire de le faire via une instruction when.

Il semble que vous pensiez que ce qui suit fonctionnera ... vous appelez setInstance et vous vous attendez à ce que getInstance renvoie la valeur qui a été transmise à setInstance car c'est ainsi que DAO fonctionnerait. Si c'est ce que vous tentez, vous ne devriez pas tester setInstance en appelant alors getInstance puisque getInstance renverra tout ce que vous avez configuré pour que la maquette se retourne et n'aura aucune relation à ce qui a été passé à setInstance. À la place, utilisez verify pour valider que la méthode appropriée de DAO a été appelée à partir de la méthode setInstance.

Par exemple, si GeneralConfigService.setInstance appels GeneralConfigDAO.setInstance alors votre test devrait ressembler à ceci ...

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

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

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

De plus, si gen est une maquette (via @Mock) pourquoi l'attribuez-vous à autre chose via gen = createGeneralConfigs...

3
John B