2017-03-04 1 views
0

je test suivant:Joignez-vous à la table ne sont pas peuplées dans le test @Transactional

@Test 
public void createNewShopAndCheckUserShopsCollection() 
{ 
    //given 
    ShopEntity shop = new ShopEntity(); 
    String shopName = "test shop"; 

    MallEntity mall = new MallEntity(); 
    mall.setId(1L); 

    UserEntity user = userService.findOne(1L); 
    int shopsModeratedBefore = user.getModeratedShops().size(); 

    shop.setMall(mall); 
    shop.setName(shopName); 
    shop.setModerators(Collections.singletonList(user)); 


    ShopEntity savedShop = shopRepository.save(shop); 
    user = userService.findOne(1L); 

    assertThat(user.getModeratedShops()).hasSize(shopsModeratedBefore + 1); 
} 

en classe annotée avec @Transactional. J'ai besoin de revenir en arrière après son exécution, afin que les autres tests n'échouent pas. Cependant, il semble que la table jointe ne soit pas remplie avant la fin de la méthode (l'assertion est en train de tomber). Comment puis-je m'assurer manuellement qu'il est mis à jour?

est ici mapping UserEntity.java

@ManyToMany(mappedBy = "moderators") 
@JsonBackReference(value = "moderatedShops") 
@Setter 
@Getter 
private List<ShopEntity> moderatedShops; 

Et ici ShopEntity.java

@ManyToMany 
@JoinTable(name = "shop_moderators", 
     joinColumns = @JoinColumn(name = "shop_id"), 
     inverseJoinColumns = @JoinColumn(name = "user_id")) 
@JsonManagedReference(value = "moderatedShops") 
@Setter 
@Getter 
private List<UserEntity> moderators; 
+0

S'il vous plaît, montrez aussi vos classes d'entités, une autre chose est que je ne sais pas si ce genre de test est nécessaire. Vous testez essentiellement si vous pouvez insérer quelque chose dans db - vous ne testez aucune logique. Vous ne savez pas si vous utilisez également spring-boot, mais si vous voulez tester les données stockées dans db, consultez https://spring.io/blog/2016/04/15/testing-improvements-in-spring- boot-1-4 # test-the-jpa-tranche – pezetem

+0

@pezetem j'ai ajouté des entités. Je sais que cela n'a pas beaucoup de sens dans une application réelle, mais j'essayais juste d'apprendre à utiliser de nombreuses relations, ajouté quelques méthodes dans le dépôt jpa liées à cela et je voulais m'assurer que cela fonctionne. – KrwawyKefir

Répondre

0

que vous manque dans votre mise en œuvre est une cascade à l'enfant. Il suffit d'ajouter @ManyToMany(cascade = CascadeType.ALL) à votre et la sauvegarde/suppression devrait également être applicable à l'entité enfant.

+0

Ce n'est pas le problème. Je veux mettre à jour la table de jointure, pas l'entité enfant. Lorsque je supprime l'annotation @Transactional, cela fonctionne correctement, mais je dois annuler les résultats afin que d'autres tests puissent être exécutés. – KrwawyKefir