주니어 개발자의 테스트 코드 이해하기
·
Spring/테스트 코드
테스트 코드의 기초와 중요성을 알아보자 📌 서론 스프링부트로 백엔드 개발을 하다 보면 테스트 코드를 작성해야 한다는 말을 정말 많이 듣게 된다. 그래서 테스트 코드가 뭐길래 이렇게까지 얘기를 하는 걸까? 테스트 코드를 작성하기 전에 테스트 코드가 무엇인지와 어떤 tool을 사용해서 작성하는지에 대해서 간단히 이해해 보자 1. 테스트 코드의 중요성 테스트 코드는 개발 과정에서 매우 중요하다. 이를 통해 버그를 조기에 발견하고 소프트웨어의 안정성을 확보할 수 있다. 특히 스프링 부트에서는 다양한 도구와 라이브러리를 제공하여 테스트 코드 작성을 쉽게 해 준다. 이런 도구들을 사용함으로써, 개발자는 애플리케이션의 다양한 부분을 효율적으로 검증할 수 있고, 결과적으로 코드의 품질을 높일 수 있다. 또한, 테스트 ..
[스프링, 스프링 부트] Spring test - when()에서 발생한 에러
·
Spring/테스트 코드
Pageable 테스트를 진행하던중 에러가 발생했다. 1. 에러가 발생한 코드 확인 when(boardService.selectAllBoardList(pageable)).thenReturn(boardDtoPage); 에러 메시지는 NullPointerException이었다. 이건 when(boardService.selectAllBoardList(pageable)).thenReturn(boardDtoPage); 부분에서 모의 객체의 동작을 설정할 때 문제가 발생한 것이다. 모의 객체의 동작을 when()또는 given()으로 설정할 때, 메서드 호출에 사용되는 인자가 정확히 일치해야 한다. Pageable 인스턴스는 동일한 페이지 번호와 페이지 크기를 가지더라도 다른 인스턴스일 수 있으므로, 이로 인해 문..
[스프링, 스프링부트] Spring test - 스프링 시큐리티의 authentication객체를 어떻게 사용해야 할까?
·
Spring/테스트 코드
Controller 테스트를 하면서 시큐리티의 authentication객체를 매게변수로 받아서 사용하도록 작성한 메서드에서 많은 고민을 하게되었다. 왜냐하면 테스트를 위해 이 객체를 주입해줘야 했기 때문이다. 그래서 어떻게 해결할지 고민을 했다. 1. 먼저 커스텀 Annotation을 만들어서 사용해보자는 결심이 들었다. 1-1. config 패키지에 annotation 패키지를 생성한다. 1-2. annotation패키지에 아래의 클래스들을 생성한다 InjectAuthentication - 어노테이션 클래스 /** * 시큐리티 authentication을 주입하는 커스텀 annotation */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.MET..
Spring 서비스 테스트 중 발견한 NPE 해결기
·
Spring/테스트 코드
게시판의 대댓글 관련 테스트 코드를 작성하다가 NullPointException이 발생했다. 1. 우선 테스트하고자는 코드를 살펴보자 서비스 코드 @Slf4j @RequiredArgsConstructor @Transactional(readOnly = true) @Service public class BoardSubCommentService { private final BoardSubCommentRepository boardSubCommentRepository; private final UserRepository userRepository; private final BoardCommentRepository boardCommentRepository; /** * 대댓글을 저장한다. */ @Transaction..
[스프링, 스프링 부트] Spring test - service 테스트에서 만난 오류
·
Spring/테스트 코드
오늘 스프링 부트 개인 프로젝트를 진행하던 도중 서비스 레이어를 테스트하다 만난 오류다. 1. 오류 확인 1-1. 에러 로그 아래와 같이 log에 남았고 이게 뭔지 찾아보니 나는 예외를 던지도록 bad case를 테스트했는데 예외가 터지지 않은것이었다. OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended java.lang.AssertionError: Expecting code to raise a throwable. at com.jinan.profile.service.board.BoardServiceTest.validUserEx..
[스프링, 스프링 부트] Spring test - Mock에 대한 이해
·
Spring/테스트 코드
이번 포스트는 Mock에 대한 심도높은 이해를 탐구하는 내용이다. 1. Mock이 뭘까? “Mock"이라는 단어는 테스트에서 많이 사용되는 용어로, 실제 객체를 모방한 가짜 객체를 의미한다. 이러한 Mock 객체는 테스트를 수행하는 동안 실제 객체의 행동을 흉내내거나 예측된 방식으로 반응하도록 설정할 수 있다. 이를 통해 테스트를 보다 통제 가능한 환경에서 실행할 수 있다. MockMVC: Spring MVC의 동작을 모방(Mock)하는 라이브러리다. 이것을 사용하면 HTTP 요청을 DispatcherServlet에 보내고 그 결과를 검증할 수 있다. 실제 네트워크를 통하지 않고도 Spring MVC의 동작을 테스트할 수 있어, 테스트 속도가 빠르고 어떤 Controller와 View가 호출되었는지, 어..
[스프링, 스프링부트] Spring test - 테스트 코드의 기초(5) [CRUD 테스트]
·
Spring/테스트 코드
이번 포스트에서는 CRUD 테스트를 작성해 보자 1. GET 테스트 이 테스트에서는 GET 요청을 사용하여 특정 사용자를 가져오는 API를 테스트한다. 우선 userService.findUserById() 메소드를 모킹하여 항상 동일한 사용자 정보를 반환하도록 한다. 그 후에 mockMvc.perform()을 사용하여 GET 요청을 보내고, andExpect()를 통해 응답 상태와 응답 본문이 예상된 값과 일치하는지 검증한다. @Test public void testGetUser() throws Exception { User user = new User("john", "doe", "john.doe@gmail.com"); Mockito.when(userService.findUserById(anyLong()..
[스프링, 스프링 부트] Spring test - 테스트 코드의 기초(4) [mock 테스트]
·
Spring/테스트 코드
이번 포스트에서는 저번에 이어 mock을 사용한 테스트 설명을 추가적으로 이어간다. 1. Mockito.mock 사용방법 > mock으로 모의객체 생성 Mockito.mock은 Mockito 라이브러리에서 제공하는 기능 중 하나로, 모의 객체(Mock Object)를 생성하는 데 사용된다. 모의 객체는 실제 객체의 동작을 흉내 내는 가짜 객체로, 테스트 시에 실제 객체를 대체하여 테스트를 수행할 수 있도록 도와준다. Mockito.mock 메서드를 사용하면 인터페이스, 추상 클래스 또는 클래스의 인스턴스를 가짜 객체로 만들 수 있다. 가짜 객체는 실제 객체의 메서드를 호출할 수 있으며, Mockito를 사용하여 원하는 동작을 정의할 수 있다. 가짜 객체는 실제 객체와 동일한 인터페이스를 가지므로 테스트 ..