newcodingtest / ProjectManagementSystem

:sunny::sunny:레거시 코드 리펙토링 해보기:sunny::sunny:
1 stars 0 forks source link

테스트 코드 작성시 could not initialize proxy - no session 오류 발생 #33

Open newcodingtest opened 2 years ago

newcodingtest commented 2 years ago
@SpringBootTest
@Slf4j
@Import(AspectAdvice.class)
public class TaskRepositoryTests{

    @Autowired
    private TaskRepository repository;        

        @Test
    @DisplayName("Qdsl 진행중 리스트 출력 테스트")
    void 진행중_리스트_가져오기_테스트() {
        //when
        List<Task>result = repository.getOnGoingList();

        log.info("result={}, size={}", result.toString(), result.size());
        //then
        Assertions.assertThat(result.size()).isGreaterThanOrEqualTo(0);
    }

    @Override
    public List<Task> getOnGoingList() {
        return queryFactory.select(task)
                .from(task).where(task.statusCode.eq("진행중"))
                .fetch();
    }

    public class Task extends BaseEntity {
       @Id
           @GeneratedValue(strategy = GenerationType.IDENTITY)
           @Column(name="TASK_ID")
           private Long tid;
           ...
           @OneToMany(mappedBy = "task", fetch = FetchType.LAZY, 
           orphanRemoval =          true)
       private List<SubTask> subTaskList = new ArrayList<SubTask>(
       }

test

newcodingtest commented 2 years ago

[해결]

해당 구문에서 프록시 오류를 발생 시킨다.

List<Task>result = repository.getOnGoingList();
log.info("result={}, size={}", result.toString(), result.size());

테스트 환경에서도 하나의 트랜잭션을 걸어 유지시켜줘야한다.

    @Test
    @DisplayName("Qdsl 진행중 리스트 출력 테스트")
    void 진행중_리스트_가져오기_테스트() {
        //when
        List<Task>result = repository.getOnGoingList();

        log.info("result={}, size={}", result.toString(), result.size());
        //then
        Assertions.assertThat(result.size()).isGreaterThanOrEqualTo(0);
    }

또는 테스트 클래스 에 한번에 걸어줘도 된다.

@SpringBootTest
@Slf4j
@Import(AspectAdvice.class)
@Transactional
public class TaskRepositoryTests{
...
}