본문 바로가기

프로젝트

TIL-221103- jpa의 기능을 테스트하려는 건 불필요하다

오늘은 장바구니 기능을 구현하기 위해서 시간을 좀 써봤다. 

 

장바구니의 상품이라는 cartItem이라는 모델을 만들어 주고 cart라는 모델도 만들어 주었다. cart모델이 cartItem의 id를 가지고 있고 

cart가 user의 id를 가지고 있는 구조로 -> -> -> 단방향으로 타고타고 들어가서 찾는 식으로 해야 하는데 여간 복잡한게 아닌 것 같다.

 

 

장바구니의 아이템은 옵션과 수량이 정해진 상태로 저장이 되기 때문에 프론트엔드에서 옵션과 수량, productId와 userId를 받아온다.

 

productId를 받아온 이유는 장바구니의 상품도 product모델과 속성값 동일하지만 수량과 옵션을 가지고 있기 때문에 장바구니버튼을 누른 상품의 속성값들을 들고오기 위해서 productId를 들고왔다. 

 

그리고 userId는 user가 가지고 있는 cart를 찾기 위해서 받아온다. 그리고 cart에는 cartItem을 List형태로 가지는 것이 아닌 속성값으로

cartItem의 아이디를 가지고 있는다.  jpa를 위해서 oneToMany나 ManyToOne 구조를 사용하지 않는 게 코드는 조금 많아질 수 있지만 

테스트를 하기 더 좋다.

 

 

 

CartItem을 생성해주는 로직이다.  

 

 

오늘은 테스트 코드를 짜면서 조금 의아했던 점이 있었다. 위의 테스트 코드는 createCartItem 메소드를 테스트를 하는데 

 

createCartItem의 반환 값은 CartItem cartItem = cartRepository.save(cartItem) 의 값이다

 

처음에는 assertThat으로 notNull을 체크 해주려고 했는데 계속 null값이 나왔다. ??

 

시도 1

아 repository모킹을 안 해줘서 그렇구나 라고 판단하고 

 

repository의 save메소드를 모킹 해본 결과 역시나 마찬가지로 null값이 나온다. 

 

이외의 방법도 모두 cartItem은 null을 반환을 한다. 그렇다면 이런 결론이 나온다. cartItem자체에 대해서 뭔가 값을 확인하려는 것은 

불필요한 테스트이다. 

 

즉 jpaRepository를 우리는 믿고 쓰고 있는데 굳이 jpaRepository의 메소드를 테스트를 할 필요가 있을까? 그건 jpa를 만든 사람들이 이미 다 테스트를 했기 떄문에 jpa를 사용하는 우리는 그냥 save가 됬는지만 확인을 하면 되는 것이다.

 

 

GenerateValue 어노테이션을 붙여놔서 그에 대한 아이디 값 이 생겼나 같은 것은 필요가 없는 테스트 라는 것이다. 

 

그냥 save라는 행동을 했다는 것이 중요하기 때문에 verify로 확인을 해주는 식으로만 테스트를 하면 된다. 

 

대부분의 create과정은 이런 식으로 테스트를 진행하면 된다. 

 

어제는 장바구니 구현을 목표로 했는데 방향을 틀어서 리뷰 보기 부터 구현을 먼저 해야할 것 같다. 

 

내일은 리뷰를 내용을 구현해보도록 하자