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?
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
...
}
}
N'oubliez pas d'utiliser
MockitoAnnotations.initMocks(this);
Si vous êtes un objet moqueur par le biais d'annotations, c'est-à-dire @Mock Objectname
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...