Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre actif
    lazy initialization dans un test d' integration d'une application spring boot
    Bonjour, je travaille sur une application spring boot. J'ai développé une fonctionalité qui marche bien sans erreur. Cependant, quand je fais un test d'intégration avec le même code, j'ai l'erreur suivante:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
        org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.vol.domain.DimPartner.partnerOrderHeaders, could not initialize proxy - no Session


    Voici la méthode où il y a une erreur

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
        private  List<OrderHeaderClusterData> constructOrderHeaderClusterDataFromPartner(DimPartner dimPartner) {
        	List<OrderHeaderClusterData> orderHeaderClusterDatas = new ArrayList<OrderHeaderClusterData>();
        	OrderHeaderClusterData orderHeaderClusterData = new OrderHeaderClusterData();
        	Set<FactAssocPartnerOrderHeader> factAssocPartnerOrderHeaders = dimPartner.getPartnerOrderHeaders();
        	DimOrderHeader dimOrderHeader = null;
        	Set<FactOrderItem> factOrderItems = null;
        	FactOrderItemClusterData factOrderItemClusterData = null;
        	for (FactAssocPartnerOrderHeader factAssocPartnerOrderHeader : factAssocPartnerOrderHeaders) {
        		orderHeaderClusterData = new OrderHeaderClusterData();
        		dimOrderHeader = factAssocPartnerOrderHeader.getHeader();
        		orderHeaderClusterData.setOrderNo(dimOrderHeader.getOrderNo());
        		PartnerData partnerData = dimPartner != null ? ConvertDomainObjectToDataObjectAndReverse.convertDimPartnerToPartnerData(dimPartner) : null;
        		orderHeaderClusterData.setPartnerDatas(Arrays.asList(new PartnerData[]{partnerData}));
        		factOrderItems = dimOrderHeader.getItems();
        		List<FactOrderItemClusterData> factOrderItemClusterDatas = new ArrayList<FactOrderItemClusterData>();
        		for (FactOrderItem factOrderItem : factOrderItems) {
        			factOrderItemClusterData = new FactOrderItemClusterData();
        			factOrderItemClusterData.setItemNo(factOrderItem.getOrderItemNo());
        			factOrderItemClusterData.setStcPurchaseOrder(factOrderItem.getCustomerPoItemLevel());
        			factOrderItemClusterData.setStcPOItem(factOrderItem.getItemNoCustomerPoLevel());
        			factOrderItemClusterData.setDimensionData(factOrderItem.getDimension() != null ? ConvertDomainObjectToDataObjectAndReverse.convertDimDimensionToDimensionData(factOrderItem.getDimension()) : null);
        			factOrderItemClusterData.setMaterialData(factOrderItem.getMaterials() != null ? ConvertDomainObjectToDataObjectAndReverse.convertDimMaterialToMaterialData(factOrderItem.getMaterials()) : null);
        			factOrderItemClusterDatas.add(factOrderItemClusterData);
        		}
        		orderHeaderClusterData.setFactOrderItems(factOrderItemClusterDatas);
        		orderHeaderClusterDatas.add(orderHeaderClusterData);
        	}
        	return orderHeaderClusterDatas;
     
        }


    L'erreur se produit à cette ligne:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
           for (FactAssocPartnerOrderHeader factAssocPartnerOrderHeader : factAssocPartnerOrderHeaders){



    Mais la chose importante est le fait que ça marche sans erreur quand je teste la fonctionnalité alors que ça ne marche pas dans la partie test d'intégration. Il doit me manquer un détail de configuration pour les tests. Pouvez vous m'aider s'il vous plait ?

  2. #2
    Membre expert
    Première hypothèse : pas de transaction ouverte ...

  3. #3
    Membre actif
    Merci pour ta réponse JeitEmgie. Oui, je pense que c'est ça. Mais comment ça se fait que les transactions soient ouvertes quand j'utilise l'application après l'avoir lancé (spring boot application) et que dans la partie tests d'intégration, les transactions ne soientr pas ouvertes ? Je pense qu'il y a quelque chose dans la configuration de l'application qui ne va pas.

    Voici le test

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	  restCustomerOrderMockMvc
          .perform(get("/api/orders/modification?"
                  +"beginInsertionOrModificationDate=" + ORDER_ZONE_DATE_TIME_NO_1+
                  "&endInsertionOrModificationDate=" + ORDER_ZONE_DATE_TIME_NO_4)
          .accept(MediaType.APPLICATION_JSON))
          .andExpect(status().isOk()).andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))
          .andExpect(jsonPath("$.resultCode").value(BusinessErrorCode.NO_ERROR.getCode()))
          .andExpect(jsonPath("$.size").value("1"))
          .andExpect(jsonPath("$.entities[0]." + F_ORDER_HEADER_NO).value(ORDER_NO_1))                
          .andExpect(jsonPath("$.entities[0].partnerDatas[0]" + F_END_USER_UNIQUE_COMPANY_CODE_COM_API).value(PARTNER_1))
    	  .andExpect(jsonPath("$.entities[0].factOrderItems[0]" + F_ORDER_ITEM_NO).value(ITEM_NO_1))
    	  .andExpect(jsonPath("$.entities[0].factOrderItems[0].dimensionData." + F_WEIGHT_COM_VALUE1_COM_API).value(WEIGHT_COM_VALUE_1))
    	  .andExpect(jsonPath("$.entities[0].factOrderItems[0].materialData." + F_STEEL_GRADE).value(STEEL_GRADE_1));

  4. #4
    Membre expert
    "restCustomerOrderMockMvc" ?
    c'est plutôt pour les test unitaires
    donc hypothèse suivante : pas le bon transaction manager !
    (vous ne pouvez pas utiliser le même que celui d'un contexte JEE)


  5. #5
    Membre actif
    Bonjour, en rajoutant l'annotation @Transactional dans ma classe de test, cela a résolu mon problème