@Tests de transactions et de référentiels
-
21-12-2019 - |
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.
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.