본문 바로가기
백엔드(Back-End)/Spring Boot

[sts4-Spring Boot] 04. CRUD Test 작성

by 기딩 2023. 11. 28.
728x90

이전 글에서 연결시킨 CRUD가

2023.11.28 - [백엔드(Back-End)/Spring Boot] - [sts4-Spring Boot] 04. CRUD Test 작성

잘 동작하는지 테스트할 차례이다.

 

그래서 src/메인/자바 or src/메인/리소스 디렉토리보다 src/테스트/자바를 건드릴 일이 많다.

 

잘 매핑이 되었는지 확인할 것이므로

테스트 디렉토리의 com.프로젝트명 패키지에 테스트 클래스를 만들어주자.

(src/main/java와 똑같이 com.프로젝트명 패키지가 있으므로 헷갈릴 수 있으니 조심하자...)

 

 

각 기능이 잘 되는지 단위테스트를 해볼 것인데,

 이를 스프링에 인식시켜주도록 @SpringBootTest 어노테이션을 적어준다.

 


 

먼저 게시글을 작성하는 기능을 테스트해보자.

 

@Autowired를 통해 Mapper 인터페이스 Bean 주입

 

테스트 메서드에서는 매개변수, 반환타입을 잘 적어줘야 하는데

이는 sql문을 적었던 sc/리소스/자바의 Mapper.xml파일이나

메서드들을 다 정의했던 src/메인/자바 > mapper 패키지의 Mapper.java를 보면서 적으면 된다.

다른 기능 단위테스트들도 이 사진을 보면서 말하겠다.

 

 

게시글을 작성하는 메서드를 insertBoard라고 정의

  -> @Test public void testOfInsert() {

매개변수는 도메인 패키지의 BoardDTO 객체

  -> BoardDTO params = new BoardDTO();

반환은 성공/실패만 판단하는 용도인 int형

  -> int result = boardMapper.insertBoard(params);

Mapper.xml의 insertBorad 메서드 sql문 내용

 

테이블의 컬럼에 각각의 value를 넣을 것이므로

DTO에서 작성한 setter 함수를 이용하여 java에서 입력한 컬럼과 db의 컬럼을 잘 연결시켜주자.

 

이를 정리하면 다음과 같다.

 

package com.board;

import java.util.List;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.CollectionUtils;

import com.board.domain.BoardDTO;
import com.board.mapper.BoardMapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

@SpringBootTest
public class MapperTests {
	
	@Autowired
	private BoardMapper boardMapper;
	
	@Test
	public void testOfInsert() {
		BoardDTO params = new BoardDTO();
		params.setTitle("1번 게시글 제목");
		params.setContent("1번 게시글 내용");
		params.setWriter("테스터");
		
		int result = boardMapper.insertBoard(params);
		System.out.println("결과는 " + result + "입니다.");
	}
}

메서드를 작성하고

메서드명을 드래그하여 오른쪽클릭>Run As > Junit으로 실행한다.

 

 

잘 작동이 됐다면 "결과는 1입니다"라는 텍스트만 문구에 뜨고 글 제목, 내용, 작성자는 뜨지 않는다.

또한, 데이터베이스에 잘 반영이 됐는지 확인해보자.

다른 테스트도 작동한 후라서, 다를 수 있다.

 


다른 기능들도 똑같은 방식으로 작성하여 테스트하면 된다.

 

	// 게시글 조회 기능 테스트
    @Test
	public void testOfSelectDetail() {
    // DTO 타입 객체 변수인 board에 메서드 결과 저장
    // long 1은 1번 게시글 조회위한 기본키 인덱스 값
		BoardDTO board = boardMapper.selectBoardDetail((long) 1);
		try {
			String boardJson = new ObjectMapper().registerModule(new JavaTimeModule()).writeValueAsString(board);
			System.out.println("==============================");
            // Jackson 라이브러리 통해 JSON 문자열 변경하여 출력
			System.out.println(boardJson);
			System.out.println("==============================");
		} catch(JsonProcessingException e) {
			e.printStackTrace();
		}
	}
	
    // 게시글 수정 기능 테스트
	@Test
	public void testOfUpdate() {
		BoardDTO params = new BoardDTO();
		params.setTitle("1번 게시글 제목을 수정합니다.");
		params.setContent("1번 게시글 내용을 수정합니다.");
		params.setWriter("홍길동");
		params.setIdx((long) 1);
		
		int result = boardMapper.updateBoard(params);
		if (result == 1) {
			BoardDTO board = boardMapper.selectBoardDetail((long) 1);
			try {
				String boardJson = new ObjectMapper().registerModule(new JavaTimeModule()).writeValueAsString(board);
				
				System.out.println("==========================");
				System.out.println(boardJson);
				System.out.println("==========================");
			} catch (JsonProcessingException e) {
				e.printStackTrace();
			}
		}
	}
	
    // 게시글 삭제 기능 테스트
	@Test
	public void testOfDelete() {
		int result = boardMapper.deleteBoard((long) 1);
        // delete_yn이 1로 잘 변경됐다면, 결과는 성공이므로 1
		if (result == 1) {
			BoardDTO board = boardMapper.selectBoardDetail((long) 1);
			try {
				String boardJson = new ObjectMapper().registerModule(new JavaTimeModule()).writeValueAsString(board);
				
				System.out.println("==========================");
				System.out.println(boardJson);
				System.out.println("==========================");
			} catch (JsonProcessingException e) {
				e.printStackTrace();
			}
		}
	}
	
    // 여러 행 추가하는 용도
	@Test
	public void testOfMultiple() {
		BoardDTO params = new BoardDTO();
		for (int i = 0; i < 50; i++) {
			params.setTitle(i+"번 게시글 제목");
			params.setContent(i+"번 게시글 내용");
			params.setWriter(i+"번 테스터");
			int result = boardMapper.insertBoard(params);
			System.out.println("결과는 " + result + "입니다.");
		}	
	}
	
    // 게시글 목록 조회 기능 테스트
	@Test
	public void testSelectedList() {
    // 삭제 안 된 게시글 수 카운팅
		int boardTotalCount = boardMapper.selectBoardTotalCount();
		if (boardTotalCount > 0) {
			List<BoardDTO> boardList = boardMapper.selectBoardList();
            // boardList가 안 비어있는지 체크
			if(CollectionUtils.isEmpty(boardList) == false) {
				for (BoardDTO board : boardList) {
					System.out.println("==========================");
					System.out.println(board.getTitle());
					System.out.println(board.getContent());
					System.out.println(board.getWriter());
					System.out.println("==========================");
					
				}
			}
		}
	}

 

728x90