강의리뷰
박우빈 - Practical Testing: 실용적인 테스트 가이드
기존에 작성해오던 테스트 코드를 한 번 더 정리하는 시간이었다.
테스트 코드를 작성하는 방법의 큰 틀은 비슷하지만 개발자마다 조금씩은 다른 거 같다.
좋았던 점 기억에 남는 점들을 짧게 정리해 보았습니다.

테스트는 왜 작성해야 하는가?
- 문서화
- 빠른 피드백
- 자동화, CI에서 우리가 작성한 테스트 코드로 버그가 배포되는 것을 방지
- 리팩토링 시 신뢰도
일반적으로 Given-When-Then 패턴을 중심으로 작성한다.
기대 결과를 검증(Then) 부분에서 사용하는 메서드의 차이가 보였다.
기존에 사용하던 방법

기존에 사용하던 assertThat 을 사용해 검증할 경우에는 한줄에 하나값만 테스트 할수있다.
강의에서나온 방법

extracting 메서드는 리스트에서 속성 값을 추출한다. productNumber, price 값을 입력한다.
containsExactlyInAnyOrder는 추출한 속성 값이 주어진 순서대로 일치해야 한다.
첫번째 객체 productNumber = 001, price= 1000
두번째 객체 productNumber = 002, price= 3000
tuple을 사용해 테스트할수있다.
containsExactlyInAnyOrder(tuple("001", 1000), tuple("002", 3000))
정답은 없지만
검증해야될값이 많고 리스트에 담긴값들이 여러개라면 강의에 나온방법을 사용하면 좋을 듯하다.
Mock

결제 완료 시 메일을 발송하는 로직을 만들고 싶다.
실제로 메일을 보내는 로직을 구현하기보다는 mock으로 처리할 수 있다.
불필요한 과정들을 mock을 사용해서 테스트 시 쉽게 처리할 수 있다.
!! 메일 전송하는 로직은 트랜잭션을 붙이지 않는 게 좋다.
트랜잭션을 붙이는 경우 db 조회 시 커넥션의 자원을 소유하게 되고 다른 트랜잭션이 접근할 수 없다.
메일 전송 같은 긴 네트워크를 타는 작업의 경우 트랜잭션을 걸지 않는 게 좋다.

@MockBean 어노테이션을 붙여준다.

Mockito.when을 사용하여 가짜 객체를 넣어놓고 요청을 했을 때 이런 결과값을 리턴했으면 좋겠어 라는 것들을 정할 수 있다.
Mock을 과하게 사용하기보다는 적재적소에 사용하면 좋을 거 같다.
주로 외부 시스템 이용할 때 간편하게 테스트하기 위해 사용하게 될듯하다.
주로 Mock과 Spy를 사용하고 싶다는 생각이 들었고
- Mock과 Spy의 차이점은
Spy는 특정 메서드만 Mock으로 실행하고, 특정 메서드는 실제로 실행하고 싶을 때 쓴다.
deleteAllinbatch 사용이유


- delteAll 메서드 들어가 보면 for 문으로 하나하나 쿼리 날려서 삭제해서 성능 저하로 이어질 수 있다.
아무리 인메모리 db를 쓴다 해도 다수의 쿼리가 나간다면 비용이 많이 든다.
반면 deleteAllinbatch 같은 경우 in 절로 묶어 쿼리가 하나로 나가기 때문에 성능 면에서 더 좋다.
jpa n+1 문제에서 yml 설정으로 batch 사이즈를 설정해 해결하는 방법과 유사하다고 느꼈다.
List.of()의 사용과 saveAll()

그동안은 하나하나 save() 하는 방식으로 작성을 했었다.
saveAll()을 사용하니 좀 더 간결하고 가독성 측면에서 좋은 거 같다.
List.of() 같은 경우 자바 9부터 나왔다.
아직까지 많은 회사들이 자바 8을 사용 중이라 바로 연결해 사용하기 어려울 수도 있을 듯하다.