Question

j'ai vu ça @Transactional est mieux placé au niveau de la couche service mais le problème est que je ne parviens pas à tester correctement mes référentiels car les modifications ne sont pas validées.

Lors du test du référentiel save() méthode, je veux utiliser find() pour voir si l'entité a été correctement enregistrée mais parce que save() les modifications ne sont pas validées dans la base de données, find() renvoie null.

La seule solution que je vois est d'ajouter le @Transactional annotation:

  • sur le dépôt save() méthode
  • sur le testSave() méthode => mais IMO, c'est faux car cela modifie le comportement

Peut-être que je comprends mal quelque chose, j'ai commencé à apprendre Java il y a deux jours.

Était-ce utile?

La solution

Vous n'avez pas besoin des modifications apportées à la base de données, vous n'avez besoin que des requêtes émises dans la même transaction.Ensuite, vous ne devriez pas utiliser les mêmes moyens par lesquels vous stockez les données pour récupérer les données.Fondamentalement, vous devez utiliser plain jdbc pour tester s'il a été ajouté.

public class TestClass extends AbstractTransactionalSpringJUnit4ContextTests {

    private TestRepository repo; 

 @Test
 public void testSave() {
    int rowCount = countRowsInTable("your-table-name");
    repo.save(yourEntity);
    repo.flush(); 
    int rowCountAfter = countRowsInTable("your-table-name");
    assertTrue(rowCountAfter - rowCount == 1); // Or whatever you like to verify the row was added 
 }

Note:Si vous ne prolongez pas JpaRepository il n'y a pas flush méthode, à la place vous pouvez injecter le EntityManager dans le scénario de test et appelez flush Ici.

Au lieu de tester uniquement le nombre de lignes, vous pouvez également utiliser le jdbcTemplate du AbstractTransactionalJunit4SpringContextTests pour récupérer la ligne nouvellement ajoutée et comparer avec ce à quoi vous vous attendiez.

Autres conseils

C'est pourquoi vous commenceriez les tests en écrivant des tests unitaires tout en écrivant le code de production.Mais comme vous avez commencé à apprendre Java il y a seulement deux jours, vous ne devriez vraiment pas vous lancer dès le départ dans la gestion des transactions.Apprenez d’abord les bases et le design.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top