1. JUnit 자바 진영의 대표적인 Test FrameWork 단위 테스트를 위한 도구를 제공 단위 테스트란? 코드의 특정 모듈이 의도된 대로 동작하는지 테스트하는 절차를 의미 모든 함수와 메서드에 대한 각각의 테스트 케이스를 작성하는 것 어노테이션을 기반으로 테스트를 지원. 단정문(Assert)로 테스트 케이스의 기댓값에 대해 수정 결과를 확인할 수 있음. JUnit 5는 크게 Jupiter, Platform, Vintage 모듈로 구성됨 2. JUnit LifeCycle Anotation 어노테이션 설명 @Test 테스트용 메소드를 표현하는 어노테이션 @BeforeEach 각 테스트 메소드가 시작되기 전에 실행되어야 하는 메소드를 표현 @AfterEach 각 테스트 메소드가 시작된 후에 실행되어야 ..
초안 @Test @DisplayName("게시글 삭제 성공 테스트") void deleteBoard() { //given Board board = mock(Board.class); User user = mock(User.class); when(boardRepository.findById(board.getId())).thenReturn(Optional.of(board)); when(Optional.of(board).get().checkBoardWriter(user)).thenReturn(true); //when boardService.deleteBoard(board.getId(),user); //then verify(boardRepository).deleteById(board.getId()); } } 부연..
초안 @Test @DisplayName("게시글 목록 불러오기 테스트") void getBoards() { // given Pageable pageable = mock(Pageable.class); PageDto pageDto = mock(PageDto.class); when(pageDto.toPageable()).thenReturn(pageable); when(boardRepository.findAll(pageable)).thenReturn(Page.empty()); // when Page pagingProductResponse = boardService.getBoards(pageDto); // then assertThat(pagingProductResponse).isNotNull(); } @Test ..
초안 @Test @DisplayName("게시글 업데이트 성공 테스트") void updateBoard() { // given User user = mock(User.class); Board board = mock(Board.class); BoardRequestDto boardRequestDto = mock(BoardRequestDto.class); when(boardRepository.findById(board.getId())).thenReturn(Optional.of(board)); when(Optional.of(board).get().checkBoardWriter(user)).thenReturn(true); // 이 두 줄은 깡통에게 "이런 질문이 오면 무조건 이렇게 대답해" 하고 명령을 넣어놓는 ..
일단은 생성 성공 테스트부터 초안 @ExtendWith(MockitoExtension.class) class BoardServiceImplTest { @Mock BoardRepository boardRepository; @InjectMocks BoardServiceImpl boardService; @Test @DisplayName("게시글 생성 성공 테스트") void createBoard() { BoardRequestDto requestDto = BoardRequestDto.builder() .title("title1") .content("content1") .build(); User user = mock(User.class); //when boardService.createBoard(requestDt..
전체 코드(한꺼번에 연달아서 붙여넣기) 컨트롤러 @RestController @RequestMapping("/boards") @RequiredArgsConstructor public class BoardController { private final BoardService boardService; private final SetHttpHeaders httpHeaders; // 게시글 생성 @PostMapping public ResponseEntity createBoard( @RequestBody BoardRequestDto boardRequestDto, @AuthenticationPrincipal UserDetailsImpl userDetails) { boardService.createBoard(boar..
일반적으로 컨트롤러에는 별도의 로직이 없다. 서비스를 부르는 게 그냥 단순함. 스프링은 컨테이너다. @Conponent 는 스프링 보고, "이 객체를 관리해줘" 라고 말하는 것이다. 객체는 일반적으로 new 붙이고 사용하는데, 여기서는 그냥 쓰고 있다. private final SetHttpHeaders httpHeaders; 이게 스프링의 역할. 스프링이 객체를 만들어서 넣어줬어. setHeaderTypeJson() 이걸 매번 쓰고 있으니까 아예 클래스로까지 빼서 이것만 사용하게 만들 수 있도록 해 둔 것 같다. 이걸 클래스에서 객체로 만들지 않고 그냥 static으로 만들면 어디서든 쓸 수 있으니까, static으로 리펙토링 하는 것을 고려해보도록. UserDetails는 사용자 정보 관련 시큐리티다..

예외처리 관련 프로그램 실행 중 예기치 못한 사건을 예외라고 한다. 예외 상황을 미리 예측하고 처리하는 것을 예외처리라고 한다. 기본적으로 런타임 시점에서 발생하는 오류는 에러(error)와 예외(exception)으로 나뉜다. 에러(Error) : 메모리 부족(OutOfMemoryError)이나 스택오버플로우(StackOverflowError)와 같이 일단 발생하면 복구할 수 없는 심각한 오류 예외(exception) : 인자값 Null 에러NPE(NullPointException)같은 발생하더라도 수습이 가능한 덜 심각한 오류. 실행 예외 (RuntimeException) Runtime Error: 프로그램 실행 시점에서 발생하는 에러로 컴파일러는 컴파일 시점에서 문법 오류나 오타같은 컴파일시점에서 ..