본문 바로가기
Side Project/To do List API

TodoService 테스트 코드

by BellOne4222 2024. 2. 3.

 

ADD() 테스트

 

@Test
	void add() {
		// Mock 객체를 사용하여 todoRepository.save(any(TodoEntity.class)) 호출 시 첫 번째 인자를 반환하도록 설정
		when(this.todoRepository.save(any(TodoEntity.class))).then(AdditionalAnswers.returnsFirstArg());

		// 테스트를 위한 TodoRequest 객체 생성
		TodoRequest expected = new TodoRequest();
		expected.setTitle("Test Title");

		// TodoService의 add 메서드 호출
		TodoEntity actual = this.todoService.add(expected);

		// 반환된 값과 예상값을 비교하여 테스트 수행
		assertEquals(expected.getTitle(), actual.getTitle()); // 제목 비교
	}

 

 

searchById() 테스트

@Test
	void searchById() {
		// 테스트용 TodoEntity 객체 생성
		TodoEntity entity = new TodoEntity();
		entity.setId(123L);
		entity.setTitle("TITLE");
		entity.setOrder(0L);
		entity.setCompleted(false);

		// 생성된 TodoEntity를 Optional로 감싸기
		Optional<TodoEntity> optional = Optional.of(entity);

		// Mock 객체를 사용하여 todoRepository.findById(anyLong()) 호출 시 위에서 생성한 Optional 반환하도록 설정
		given(this.todoRepository.findById(anyLong())).willReturn(optional);

		// TodoService의 searchById 메서드 호출
		TodoEntity actual = this.todoService.searchById(123L);

		// 예상 결과값 설정
		TodoEntity expected = optional.get();

		// 반환된 값과 예상값을 비교하여 테스트 수행
		assertEquals(expected.getId(), actual.getId()); // ID 비교
		assertEquals(expected.getTitle(), actual.getTitle()); // 제목 비교
		assertEquals(expected.getOrder(), actual.getOrder()); // 순서 비교
		assertEquals(expected.getCompleted(), actual.getCompleted()); // 완료 여부 비교
	}

 

searchByIdFailed 테스트

// 에러가 잘 발생하는지에 대한 테스트
	@Test
	public void searchByIdFailed(){
		// Mock 객체를 사용하여 todoRepository.findById(anyLong()) 호출 시 Optional.empty()를 반환하도록 설정
		given(this.todoRepository.findById(anyLong())).willReturn(Optional.empty());

		// searchById 메서드 호출 시 예외 발생을 확인하는 테스트
		assertThrows(ResponseStatusException.class, () -> {
			this.todoService.searchById(123L);
		});
	}

 

 

전체 테스트 코드

 

package com.example.service;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.BDDMockito.*;
import static org.mockito.Mockito.*;

import java.util.Optional;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.AdditionalAnswers;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.web.server.ResponseStatusException;

import com.example.model.TodoEntity;
import com.example.model.TodoRequest;
import com.example.repository.TodoRepository;

@ExtendWith(MockitoExtension.class) // JUnit 5에서 Mockito를 사용
	// Mockito와 JUnit 5 간의 상호 작용을 원활하게 만들어주는 역할을 합니다. MockitoExtension은 Mockito 기능을 JUnit 5에 연결하여 Mock 객체를 초기화하고 관리하는 데 도움을 준다.
	// Mockito 테스트 확장을 활성화하며, Mockito의 기능을 JUnit 5에 통합시키는 역할을 한다.
class TodoServiceTest {

	@Mock // Mock 객체 생성
	// 사용하는 이유: 외부 시스템에 의존하지 않고 자체 테스트를 실행하기 위해서
	// 유닛 테스트는 네트워크에 연결되지 않아도 실행되어야 하므로 외부 의존성을 Mock 객체로 대체하여 테스트 가능하게 함
	// 또한, 실제 DB에 연결하지 않고도 Mock을 통해 테스트를 수행할 수 있음
	private TodoRepository todoRepository;

	@InjectMocks // Mock 객체를 주입받아서 사용하는 객체에 주입
	private TodoService todoService;
	// 사용하는 이유: Mock 객체를 주입받아 TodoService의 의존성을 주입하는 어노테이션
	// Mock 객체가 자동으로 주입되어 테스트 대상인 TodoService가 실제 TodoRepository의 Mock을 사용하도록 함


	@Test
	void add() {
		// Mock 객체를 사용하여 todoRepository.save(any(TodoEntity.class)) 호출 시 첫 번째 인자를 반환하도록 설정
		when(this.todoRepository.save(any(TodoEntity.class))).then(AdditionalAnswers.returnsFirstArg());

		// 테스트를 위한 TodoRequest 객체 생성
		TodoRequest expected = new TodoRequest();
		expected.setTitle("Test Title");

		// TodoService의 add 메서드 호출
		TodoEntity actual = this.todoService.add(expected);

		// 반환된 값과 예상값을 비교하여 테스트 수행
		assertEquals(expected.getTitle(), actual.getTitle()); // 제목 비교
	}

	@Test
	void searchById() {
		// 테스트용 TodoEntity 객체 생성
		TodoEntity entity = new TodoEntity();
		entity.setId(123L);
		entity.setTitle("TITLE");
		entity.setOrder(0L);
		entity.setCompleted(false);

		// 생성된 TodoEntity를 Optional로 감싸기
		Optional<TodoEntity> optional = Optional.of(entity);

		// Mock 객체를 사용하여 todoRepository.findById(anyLong()) 호출 시 위에서 생성한 Optional 반환하도록 설정
		given(this.todoRepository.findById(anyLong())).willReturn(optional);

		// TodoService의 searchById 메서드 호출
		TodoEntity actual = this.todoService.searchById(123L);

		// 예상 결과값 설정
		TodoEntity expected = optional.get();

		// 반환된 값과 예상값을 비교하여 테스트 수행
		assertEquals(expected.getId(), actual.getId()); // ID 비교
		assertEquals(expected.getTitle(), actual.getTitle()); // 제목 비교
		assertEquals(expected.getOrder(), actual.getOrder()); // 순서 비교
		assertEquals(expected.getCompleted(), actual.getCompleted()); // 완료 여부 비교
	}

	// 에러가 잘 발생하는지에 대한 테스트
	@Test
	public void searchByIdFailed(){
		// Mock 객체를 사용하여 todoRepository.findById(anyLong()) 호출 시 Optional.empty()를 반환하도록 설정
		given(this.todoRepository.findById(anyLong())).willReturn(Optional.empty());

		// searchById 메서드 호출 시 예외 발생을 확인하는 테스트
		assertThrows(ResponseStatusException.class, () -> {
			this.todoService.searchById(123L);
		});
	}
}

 

'Side Project > To do List API' 카테고리의 다른 글

TodoController 테스트 코드  (0) 2024.02.03
Front Test  (0) 2024.02.03
컨트롤러 구현  (0) 2024.02.03
서비스 코드 구현  (0) 2024.02.03
repository 구현  (0) 2024.02.02