2017-09-26 51 views
0

je le code suivant:Comment puis-je écrire unité d'essai pour persister et exceptions chasse

try { 
    em.persist(myObject); 
    em.flush(); 
} 
catch (Exception e) { 
    System.out.println("An Exception occur when trying to persist and flush"); 
} 

Dans l'essai j'ai simulé mon EntityManager avec Mockito:

@Mock 
EntityManager mockEm; 

mais persistent et rincer sont méthodes vides, je ne peux pas capable d'écrire quelque chose comme:

when(mockEm.persist(anObject).then(doSomeThing); 

Comment puis-je écrire des tests unitaires (JUnit) à mo ck em.persist et em.flush afin de tester les deux cas avec et sans exception? Merci.

+0

Cette réponse ne peut pas être simplement répondue. Que voulez-vous tester exactement - que se passe-t-il ** dans ** 'persist()/flush()' - ou êtes-vous seulement intéressé à vérifier que ces deux méthodes sont invoquées sur l'objet 'em'? – GhostCat

+0

Je veux tester quand persist ou flush retourne une exception comme EntityExistException ou PersistenceException. Dans ce cas, mon code va attraper l'exception et je veux tester ce code vraiment attraper et exécuter le code correspondant. –

+0

Ensuite, vous voulez probablement * mock * cet objet em et le faire jeter une exception lors des appels à ces méthodes. – GhostCat

Répondre

0

Je suppose que nous avons besoin de plus de détails. Pour l'instant, vous pouvez faire quelque chose comme ça: (c'est une sorte de pseudo-code).

@Test // it passess when there's one object in repository (I assume u have clean memory db) 
public void shouldPersistMyObject() throws Exception { 
    em.persist(myObject); 
    em.flush(); 
    Assert.assertThat(dao.findAll(), Matchers.equalTo(1)); 
} 

@Test(expected = <YourDesiredException>.class) // if <YourDesiredException> is thrown, your test passes 
public void shouldThrowExceptionWhenSavingCorruptedData() { 
    //set NULL on some @NotNull value, then save, like: 
    myObject.setUserId(null); 
    em.save(myObject); //exception is thrown 
} 
+0

écrit mon test comme: « @Mock EntityManager mockEm; @Test public void myTest() { lorsque –

+0

Désolé une mauvaise utilisation du commentaire. J'essaie à nouveau: Habituellement, j'ai écrit mon test comme: '@Mock EntityManager mockEm; @Mock Requête mockQuery; @InjectMocks MyClassToTest myClassToTest; lorsque (mockEm.createNamedQuery ("MyObject.findById")) .thenReturn (mockQuery); lorsque (mockQuery.setParameter (MyClassToTest.PARAM_ID, EXISTING_ID)) .thenReturn (mockQuery); @Test public void testFindById() déclenche Exception { when (mockQuery.getSingleResult()). ThenReturn (existingObject); Résultat MyObject = myClassToTest.findById (mockEmf, EXISTING_ID); assertEquals (existingObject, result); } ' –

+0

Ne mettez pas ces informations dans les commentaires - mettez à jour votre question à la place. Ou pouvez-vous lire ce que vous venez de mettre là-bas? – GhostCat