我想测试方法https://github.com/JonkiPro/popcorn/blob/develop/popcorn-core/src/main/java/com/jonki/popcorn/core/jpa/service/MoviePersistenceServiceImpl.java#L153。该类具有@Transactional批注,并且实体的列表为LAZY,因此在应用程序运行时使用列表没有问题。 我写了一个测试
@Test
public void canCreateOtherTitle() throws ResourceException {
...
this.moviePersistenceService.createOtherTitle(
otherTitle,
this.movieRepository.findByIdAndStatus(MOV_1_ID, DataStatus.ACCEPTED)
.orElseThrow(IllegalArgumentException::new)
);
...
}
运行测试后出现异常
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.jonki.popcorn.core.jpa.entity.MovieEntity.otherTitles, could not initialize proxy - no Session
一行
at com.jonki.popcorn.core.jpa.service.MoviePersistenceServiceImpl.createOtherTitle(MoviePersistenceServiceImpl.java:162)
为什么会这样?该方法在应用程序正常运行期间可以正常工作,但在测试过程中会引发异常。
答案 0 :(得分:0)
您的各种服务方法都可以正常工作,因为您已将整个服务类注释为@Transactional
。这意味着Spring将自动打开一个会话,该会话将由Hibernate用来初始化惰性集合。
另一方面,您的测试类或测试方法都没有对此进行注释,因此会出现错误。您可以尝试使用@Transactional
注释测试方法,我想这将解决您的问题。