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 :

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;
    }
  }
Le catch est toujours exécuté...

Ma classe de test est la suivante :

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());
  }
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
  /**
   * Private method to create a user DTO
   * @return UserDTO 
   */
  private UserDTO getUserDTO()
  {
    UserDTO dto = new UserDTO();
    dto.setLogin("test");
    return dto;
  }
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).

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 :

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;
  }
La liste est vide... comme si EJB3Unit n'arrivait pas à exécuter la requête correctement...