관리 메뉴

JIE0025

[Postman][4] Get Categories (컨트롤러 요청메세지 테스트) 본문

백엔드/테스트

[Postman][4] Get Categories (컨트롤러 요청메세지 테스트)

Kangjieun11 2022. 12. 19. 23:35
728x90

 

전체 카테고리 가져오는 테스트코드 작성하다가 동작을 안하길래 테스트코드 잘못적은건지 엄청 헤매다가..

애초에 getCategories가 작동하지 않는 상황에서 테스트코드를 적으려고하니 아무것도 안되지라는 생각이 갑자기 들었따. .

 

 

 

나는 기록하면서 가야 빨리 버그를 찾는 듯 해서 빨리 찾고싶은 마음으로 기록하러 왔다. 

 

 

Given

 

일단 테스트를 위해 게시글을 만들어줬다.   (일단 잘 작동하는 POST 요청메세지 ㅎㅎ..💙)

 

 

get 메소드로 전체 데이터를 가져오는거에서 500 에러가 나는데 대체 이유를 알수가 없다.

어제까진 나그래도 성장속도 빠르다고 생각했는데 역시 난 아무것도 모르는 바보다 ㅠㅡㅠㅡㅠ

 

 

일단 어디서 문제가 나는지 확인을 하려고, 컨트롤러, DTO, Entity, Service의 작동하는 곳 한개씩 breakpoint를 주었다.

 

 

 

 

휴 이제 던진다

 

 

 

기대값

전체 데이터가  JSON으로 반환되어야하고, 상태코드는 200 OK

 

 

 

 

브레이크포인트를 열심히 걸어준 효과로  대놓고 여기가 문제인게 확인이 되었다.

레포지토리에서 findAll 해주었는데, size()찍어보니까 0이다.   왜 못가져오지?/????????

 

 

✔️ 안되는 코드

@Transactional
public List<CategoryDto> getCategories () {
    List<CategoryDto> result = new ArrayList<>();
    List<Category> categories = categoryRepository.findAll();
   	
    //..... 생략 ..... ////
    
    return result;
}

 

 

 


저번에 참고하려고 봤던 게시글인데, 일단 이걸 다시보니까 뭔가 코드의 다른점이 보였다.

참고만 하고 직접 구현하는 연습을 하고 싶어서 JSON데이터만 조금 참고를 했었는데...

  1.  나는 일반 JPA Repository를 통해 findALL을 해주었고,
  2. 이사람 글은 일반 EntityManger 를 사용하는 레포지토리 클래스를 사용한다...
    1. 이 클래스 내부엔 FindAll 메서드가 있고, 
    2. 쿼리를 m을 쓰는 저걸 써준다....

 

 

https://bestinu.tistory.com/52

 

[Spring] JPA를 사용한 카테고리 (하위메뉴) 구현

JPA를 사용한 카테고리 (하위메뉴) 구현 오픈마켓 프로젝트에서 상품들을 카테고리 별로 분류하기 위해 카테고리 기능을 구현하게 됐다. 카테고리는 depth가 있기 때문에, 하위 메뉴까지 가져올

bestinu.tistory.com

 

 

하 일단 이대로 바꾸니까 작동은 잘한다.

 

 

 

✅ 현재 코드의 문제점

 

이렇게 되면 엔티티가 두개가 되고, 레포지토리도 2개가 되는데 어떻게 해야할까..? 내일 물어봐야지 ㅠㅠ

아무래도 reply에 있는 디렉토리 구조를 좀 참고해야할것 같기도 하고... 일단 동작하는걸 만드는게 우선이긴 한것같다

 

 


 

CategoryResult

package com.FlagHome.backend.v1.category.entity;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.stream.Collectors;

@Getter
@AllArgsConstructor
@NoArgsConstructor
public class CategoryResult{
    private Long id;
    private String name;
    private Long depth;
    private List<CategoryResult> children;

    public static CategoryResult of(Category category) {
        return new CategoryResult(
                category.getId(),
                category.getName(),
                category.getCategoryDepth(),
                category.getChildren().stream().map(CategoryResult::of).collect(Collectors.toList())
        );
    }

}

 

CategoryEntityMangagerRepository

package com.FlagHome.backend.v1.category.repository;

import com.FlagHome.backend.v1.category.entity.Category;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import java.util.List;

@Repository
@RequiredArgsConstructor
public class CategoryEntityMangagerRepository {
    private final EntityManager em;
    public List<Category> findAll(){
        return em.createQuery(
                "select c " +
                        "from Category c " +
                        "where c.parent is NULL"
                ,Category.class)
                .getResultList();
    }
}

 

CategoryCategoryService

@Service
@RequiredArgsConstructor
public class CategoryService {
    private CategoryRepository categoryRepository;
    private CategoryEntityMangagerRepository categoryEntityMangagerRepository;

    @Autowired
    public CategoryService(CategoryRepository categoryRepository, CategoryEntityMangagerRepository categoryEntityMangagerRepository) {
        this.categoryRepository = categoryRepository;
        this.categoryEntityMangagerRepository = categoryEntityMangagerRepository;
    }
	
    
    ///////// .... 생략 /////////
    
    
    @Transactional
	public List<CategoryResult> getCategories () {
    	List<CategoryResult> categories = categoryEntityMangagerRepository
                .findAll().stream().map(CategoryResult::of)
                .collect(Collectors.toList());
        
    	return categories;
	}
}

 

 

CategoryController

@GetMapping
public ResponseEntity<?> getCategories() {
    return ResponseEntity.ok(categoryService.getCategories());
}

 


 

 

 

이걸 테스트하다보니 문득 생각났는데

POST 날릴 때에도   본인의depth가 부모로 지정된 id의 depth보다 작은지 검증도 추가해줘야할것 같다.!!!!!

 

맥주가 내눈앞에 있는데 먹고 싶어지는 밤이다 휴

 

요청메세지 날리면 돌아오는건 잘하는데 테스트코드에선 왜 안되냐고!!!

테스트코드 제대로 공부 안된상태로 뭔가 감만 익히고 있는느낌이긴하다.

 

공부가 제대로 안된 상황이라 테스트코드가 잘 작동을 안하는걸까?

내가 모르는 스프링의 더 다른 깊숙한 어떤 개념이 있어서 그러는건가? 왜 안되지?

ㅇ ㅓㅁㄴㅎ어ㅗㄴㅁ일단 더한다고 해서 뭐가 될것 같지는 않다.

 

 

 

내일 어떻게 할건지 문제만 파악하고 그만해야겠다.

 

 

 

🏃 다음에 할일 정리!

https://jie0025.tistory.com/338

 

[현재 상황 분석] 어디가 문제일지 & 앞으로 봐야할 부분들 찾기

JIE0025 [현재 상황 분석] 어디가 문제일지 & 앞으로 봐야할 부분들 찾기 본문 프로젝트 - FLAG/테스팅 [현재 상황 분석] 어디가 문제일지 & 앞으로 봐야할 부분들 찾기 Kangjieun11 2022. 12. 19. 23:36

jie0025.tistory.com