Bonjour,
Je découvre EJB3Unit et je me retrouve face à un problème : je n'arrive pas à exécuter correctement de requête SQL correctement, j'obtiens immanquablement une valeur NULL en retour, bien que mon code soit d'une simplicité extrême...
Ma question est donc la suivante : la librairie EJB3Unit permet-elle d'exécuter du SQL ? Elle simule en tout cas un EntityManager, permet de faire des persist() puis des find(). Dans ce cas, j'obtiens bel et bien un résultat.
Par contre, dès que je tente d'appeler une fonction qui contient ce code, le résultat est toujours NULL :
Le catch est toujours exécuté...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 public UserDTO findByLogin(String login) { Query q = entityManager.createQuery("SELECT u FROM UserEntity u WHERE u.userLogin=:login"); q.setParameter("login", login); try{ UserEntity userEntity = (UserEntity) q.getSingleResult(); return DozerMappingHelper.getMapper().map(userEntity, UserDTO.class); } catch(NoResultException noResEx){ return null; } }
Ma classe de test est la suivante :
Enfin, la classe getUserDTO() contient le code suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 /** * Test find user DTO by login */ @Test public void testFindByLogin_existingLogin_expectValidDTO() { service = getBeanToTest(); Long id = service.create(getUserDTO()); assertNotNull(id); UserDTO dto = (UserDTO)service.findByLogin("test"); assertNotNull(dto); assertEquals(dto.getId(), id); assertEquals("test", dto.getLogin()); }
La première assertion passe parfaitement, l'identifiant est bien retourné avec une valeur. La seconde assertion ne passe pas, le dto retourné est null (en debug je peux voir que c'est du à une NoResultException et pas à un problème avec le mapping Dozer).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 /** * Private method to create a user DTO * @return UserDTO */ private UserDTO getUserDTO() { UserDTO dto = new UserDTO(); dto.setLogin("test"); return dto; }
La requête SQL ne peut pourtant pas être fausse, cette fonction est appelée par l'application et fonctionne parfaitement...
Merci d'avance de vos suggestions.
Edit
En mettant un point d'arrêt juste avant l'exécution de la query en mode debug, j'ai pu explorer l'objet entityManager. En explorant session -> persistenceContext -> entitiesByKey -> table, j'arrive à voir que l'entité que j'ai créée est bien enregistrée dans l'objet entityManager avec le texte "test" comme valeur du champ "login". L'objet se trouve donc bien en mémoire, mais j'ai l'impression que la requête SQL n'est pas exécutée.
J'ai également testé une fonction différente (pour simplifier encore le code) sur laquelle j'ai le même problème :
La liste est vide... comme si EJB3Unit n'arrivait pas à exécuter la requête correctement...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public List<UserEntity> findAll(){ Query q = entityManager.createQuery("SELECT u FROM UserEntity u"); List<UserEntity> users = q.getResultList(); return users; }
Partager