TestCode

@AfterEach

salmon16 2024. 6. 22. 17:36

 

 

개요

테스트 코드를 작성 중 개별 테스트에 대해선 통과를 했는데 테스트를 여러 개를 같이 돌리게 된다면 테스트가 실패하는 경우가 발생했다. 이유를 알아보자.

 

 

 

 

 

 

테스트 설명

본 프로젝트는 Cafe Kiosk를 구현하는 프로젝트로 주문을 생성하기 위해 상품을 데이터베이스에 등록을 한 후 주문번호 리스트를 받아 주분을 생성하는 테스트이다.

2개의 테스트에서 각각 상품을 만들어 데이터베이스에 save 해주었다.

 

 

 

 

테스트 실패

 

테스트를 개별로 실행했을 땐 두 개의 테스트 모두 성공을 했다.

하지만 두 개의 테스트를 동시에 실행하면 하나의 테스트에서 아래와 같은 에러를 발생하고 실패하는 경우가 발생했다.

 

java.lang.IllegalStateException: Duplicate key 001 (attempted merging values sample.cafekiosk.spring.domain.product.Product@282c0891 and sample.cafekiosk.spring.domain.product.Product@4922dc84)

 

에러 메시지를 읽어보니 key 001에 대한 중복이라고 한다.

알아보기 위해 데이터베이스에서 상품 ID(pk 아님)를 출력해 봤다.

출력하니 동일한 상품 ID가 존재하는 것을 확인했다.

우리의 로직에서 Map에 상품을 등록시키는 로직이 있는데 이때 동일한 key를 추가하려고 해서 나는 에러인 것을 확인했다. 

즉 테스트 1에서 저장한 상품이 데이터베이스에 남아있는 상태에서 테스트 2에서도 동일 상품을 저장하니 상품이 중복되는 문제였다.

 

 

문제 해결

AferEach를 사용해서 각 테스트의 수행이 완료되면 데이터베이스를 비워주는 방법으로 문제를 해결했다.

@AfterEach
void tearDown() {
	orderProductRepository.deleteAllInBatch();
    productRepository.deleteAllInBatch();    
    orderRepository.deleteAllInBatch();    
}

deleteAll을 할 땐 orderProduct는 order, product의 FK를 가지고 있으므로 제일 먼저 delete를 해주어야 한다.