luchob / softuni-may2022

Examples from our lectures as well as our common project.
17 stars 46 forks source link

Тестване на BasketService класа - проблем с SpringDataJpa при BasketRepository #124

Closed svilkata closed 2 years ago

svilkata commented 2 years ago

Здравей Лъчо,

Вече имам над 60% покритие по редове на Service слоя тестовете. Но въпреки това, има един проблем.

През цялото време имах чувство, че при работа с Repository-тата на in-memory базата данни, има някакъв проблем. В оригиналния си вид този ред връща или баскет с продукти или баскет с празен лист и си работи както трябва (преди 2-3 седмици доста си бях играл, че да заработи изобщо) BasketOrderEntity basketOrder = this.basketRepository.findBasketOrderEntitiesById(basketId).orElseThrow();

Когато обаче тествам с интеграционен тест, горния ред не работи като дава грешка LazyInitializationException exception.

Кофти така като няма съвместимост когато тествам...

Ако може да помогнеш някак - видях че има анотация @DataJpaTest, но с нея изобщо теста не тръгва. image

Всъщност проблема е голям, защото аз почти навсякъде използвам this.basketRepository.findBasketOrderEntitiesById(basketId).orElseThrow(); image

luchob commented 2 years ago

Привет!

Ексепшъна, за който говорим няма много общо с базата която използваш и се хвърля от хибернейт. Релациите by default са LAZY (мързеливи):

    @ManyToMany
    private List<ItemEntity> products;

Това означава, че като си поискаш баскета хибернейт няма да направи JOIN с продуктите а вместо това ще ти върне един прокси обект дето реално няма продукти в него. Ако се опиташ да ги достъпиш хибернейт трябва да направи заявка в момента на достъп. Затова е и LAZY. Само че, за да се случи това нещо трябва да имаш отворена сесия, а такава няма. Можеш да подходиш по разнични начини.

Има доста ресурси в нета по този въпрос. Мисълта ми е, че грешката не е свързана с базата. Може би да започнеш от тук - https://www.baeldung.com/hibernate-initialize-proxy-exception Запознай се също и с Transactional анотацията.

Поздрави, Л.

svilkata commented 2 years ago

Мерси много. Използвах @Transactional анотация, и в класа ServiceBasketTest.java тествах метод по метод, а не директно целия клас. И вече имам 95% покритие на service слоя :) image

А вариантът с JOIN FETCH работеше само ако има артикули. При 0 артикули JOIN FETCH гърмеше.