TestCode 14

테스트에서만 필요한 메서드가 생겼을 때는?

개요테스트를 진행하며 Product코드에서는 필요 없지만 Test를 진행하기 위해 필요한 메서드가 생겼을 경우는 어떻게 해야 할까에 대한 고민을 해보았다. 본론이에 대한 결론은 만들어도 된다 였다. 하지만 보수적으로 만들어야 한다.기본적으로 Test를 위해 코드를 무작위로 작성하는 것은 피해야 한다. 아래의 예시를 보자 아래의 코드에서 ProductCreateRequest의 builder는 Product코드에서는 필요가 없다.자동으로 주입되기 때문이다. 하지만 테스트를 위해 필요한 코드로 생각이 된다. @PostMapping("/api/v1/products/new")public ApiResponse createProduct(@Valid @RequestBody ProductCreateRequest requ..

TestCode 2024.07.18

private 메서드 테스트

개요private메서드를 테스트하고 싶은 경우가 있을 때 어떻게 진행해야 하는지 알아보려고 한다. 본론1. 할 필요가 없다. (하려고 해서도 안된다.)2. 만약 필요하다면 객체를 분리할 시점인가를 고민해야 한다. 먼저 1번의 경우에 대해 알아보자 아래의 코드는 createNectProductNumber이라는 private 메서드가 존재하는데 이 메서드의 역할은 카페 키오스크에서 새로운 상품이 등록될 때 기존 상품의 마지막 번호에 +1 해서 return 하는 메서드이다. ex) 아메리카노 001 , 빵 002 , 라떼 003이라는 상풍 번호를 가지고 있을 때 케이크를 추가하려면 위 메서드를 사용해 004라는 상품 번호로 등록하게 된다.  @RequiredArgsConstructor@Service@Trans..

TestCode 2024.07.18

테스트 Spring boot 띄어지는 수 줄이기

개요테스트 코드를 실행하면 Spring boot 서버가 여러 번 다시 띄어지게 된다.이에 Test 실행 시간이 길어져 서버를 통합하여 Spring boot가 실행되는 수를 줄이고자 한다. 방법기존에는 대략 6번 정도의 서버가 실행되었다.이는 각 Test가 다른 SpringBootTest가 되어있기 때문이었다. (환경이 조금이라도 달라지면 새로 띄운다 ex) MockBean이 있으면 다른 환경이라고 생각) 이를 공통 클래스로 빼어서 상속받는 구조로 바꾸어 서버 실행 수를 줄이고자 한다. 기존각 Test마다 아래와 같이 되어있다.@ActiveProfiles("test")@SpringBootTestclass OrderServiceTest { Test 하위에 IntegrationTestSupport를 두고 이 ..

TestCode 2024.07.18

테스트 팁

한 문단에 한 주제보통 글을 작성할 때 한 문단에 하나의 주제를 두고 작성하라고 많이 듣는다.테스트 또한 하나의 테스트는 하나의 주제만을 가지고 테스트를 하면 좋다. 즉 하나의 테스트 안에 여러 가지를 테스트하는 것이 아닌 테스트를 분리하는 것이 좋다. 테스트 환경의 독립성을 보장하자최대한 생성자를 이용해서 given을 작성하자 내부 함수를 사용해서 given을 작성하는 경우 내부 함수에 대한 이해가 추가적으로 필요하고 내부 함수에서 오류가 발생할 수 있다.테스트 간 독립성을 보장하자두 가지 이상의 테스트는 하나의 자원을 공유하면 안 된다.즉 static 한 변수를 공유해서 테스트를 하면 테스트 간 영향을 주니 사용하지 않아야 한다.또 테스트간 순서에 상관이 없어야 한다. 어떤 테스트가 먼저 실행되어야 ..

TestCode 2024.07.17

classicist vs mockist

classicist: 최대한 mock을 사용하지 않는다.mockist: 단위 테스트로 테스트를 이미 진행했으므로 mock사용을 권장한다. classicist 입장에선 레파지토리 테스트를 진행하고 서비스 테스트는 레파지토리와 통합해서 통합 테스트를 진행하고 컨트롤러 테스트는 서비스와 레파지토리를 mock처리해서 테스트를 한다. 또한 외부 시스템인 경우 mock처리를 해서 테스트를 한다.

TestCode 2024.07.17

Mockito.verify

Mockito.verify는 Java에서 가장 널리 사용되는 모의(mocking) 프레임워크인 Mockito에서 사용되는 메서드이다. 이 메서드는 테스트 중에 모의 객체가 특정 메서드를 호출했는지, 얼마나 자주 호출했는지 등을 검증하는 데 사용할 수 있다. 이를 통해 작성한 코드가 예상대로 동작하는지 확인할 수 있다. Mockito.verify(mailSendHistoryRepository, times(1)).save(any(MailSendHistory.class)); 위 코드는 mailSendHistoryRepository의 save함수가 1번 호출되었음을 테스트하는 코드이다.

TestCode 2024.07.16

Mock 사용하기 (@Mock, @InjectMocks, @Spy)

개요MockBean을 사용하면 스프링 컨테이너의 빈이 MockBean으로 대체되어 사용된다. 이와 반대로 단위 테스트를 진행하기 위해 스프링 컨테이너를 실행하기엔 무거울 수 있어 Mock을 사용한다.즉 Mock은 스프링과 무관하며, 그저 단순한 Mock객체를 만들어주는 어노테이션이기 때문에 스프링 컨텍스트에는 실제 객체가 Bean으로 남아있게 된다. 사용법1. 아래의 코드와 같이 Mock을 만들 클래스 타입을 Mockito.mock의 인자로 넣어주면 된다.MailSendClient = mailSendClient = Mockito.mock(MilSendClient.class);MailService mailService = new MailSerivce(mailSendClient);when(mailSendCl..

TestCode 2024.07.16

JUnit 예외 상황 테스트 하기

개요테스트를 진행할 때 예외를 던지는 케이스에 대해 JUnit을 사용해서 테스트를 진행하는 방법을 알아보자 방법 import static org.assertj.core.api.Assertions.assertThatThrownBy;assertthatTrownBy를 import 한다.assertThatThrownBy(() -> stock.deductQuantity(quantity)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("차감할 재고 수량이 없습니다.");위 코드와 같이 stock.deductQuantity를 호출했을 때 만약 예외를 던지는 경우 isInstanceOf를 사용해서 예외를 체크하고 hasMessage를 ..

TestCode 2024.07.15

JUnit 객체의 필드 값 확인하기

개요테스트 코드를 작성하다 보면 데이터베이스에 값이 잘 저장되었는지 확인하기 위해 repository에서 객체를 로드해고 테스트해야 하는 경우 객체의 필드 값을 테스트해보고 싶은 때 방법을 알아보기 위해 작성하게 되었다. 방법 아래의 코드는 stockRepository에서 저장되어 있는 모든 stocks를 조회하고 그 중 productNumber, quantity의 필드 값을 확인해 보려고 한다. 이때 extracting을 사용해 필드 값을 추출한 뒤 containsExactlyInAnyOrder를 사용해서 순서와 상관없이 두 개의 tuple을 가지고 있으면 통과한다. List stocks = stockRepository.findAll();assertThat(stocks).hasSize(2) ..

TestCode 2024.07.15

Mockito 사용하기

개요컨트롤러를 테스트할 때 서비스로직을 이용해야 할 때가 있다 이때 Mockito를 사용하자 방법1. 사용할 서비스를 MockBean으로 등록한다.@MockBean // 컨테이너에 mock으로 만든 객체를 넣어준다.private ProductService productService; 2. 테스트 로직에서 mockBean의 동작 방법을 when을 사용해서 정한다.List result = List.of();when(productService.getSellingProducts()).thenReturn(result);현재 테스트에서 productService의 getSellingProducts를 호출하면 result를 반환한다. 3. 테스트를 작성한다.이때 객체를 Json으로 변환해 주기 위해 objectMap..

TestCode 2024.07.13