프로그램 개발에서 가장 중요한 부분은 바로 디버깅이다. 어떤 프로그램을 개발하든 프로그래머의 예상을 벗어나는 버그는 항상 발생할 수밖에 없고, 정상적으로 동작하는 프로그램을 만들기 위해선 이런 버그를 해결하는 디버깅 작업을 실행해야 하는데, Spring Initializr로 생성한 Spring 프로젝트는 디버그용 라이브러리 JUnit과 AssertJ를 이용해 손쉽게 디버깅할 수 있다.
Spring에서 디버깅은 src/test 폴더 안에 테스트 전용 java 파일을 만들어 실행한다. 이 파일 안에는 테스트할 클래스를 인자로 가진 테스트 전용 클래스를 만들어 진행하는데, 이 때 테스트는 main 메소드가 아닌 Annotation으로 JUnit의 @Test를 붙여 runnable하게 만든 여러 메소드에서 진행하게 된다. 이 때 각 메소드의 결과를 남기지 않기 위해 생성자는 따로 사용하지 않고, JUnit의 @BeforeTest라는 Annotation을 붙여 테스트를 진행할 때마다 환경을 초기화하게 된다.
각 테스트 메소드는 println 함수를 이용해 값을 콘솔에 찍을 수도 있지만, 주로 AssertJ의 Assertions에 있는 assertThat 함수를 이용한다. assertThat 함수는 확인하고 싶은 값을 인자로 받아 ObjectAssert라는 wrapper 객체로 바꿔주는 함수인데, 이 ObjectAssert에는 isEqualTo, isTrue, isNotNull 등 값을 특정 조건과 비교하는 여러 메소드를 가진다. 이 메소드들은 값이 특정 조건(예를 들어 isTrue의 경우 값이 True일 때, isNotNull의 경우 값이 Null이 아닐 때 등)에 부합하는지 확인한다. 만일 부합하는 경우 별다른 값을 반환하지 않지만, 부합하지 않는 경우 객체의 값과 원하는 값을 비교하는 Exception을 반환하기 때문에 매우 쉽게 값을 비교할 수 있다.
// src/test/java/{package}/service/PersonServiceTest.java
package com.example.demo.service;
import java.util.Optional;
import com.example.demo.domain.Person;
import com.example.demo.repository.PersonRepositoryMemory;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.*;
public class PersonServiceTest {
PersonServiceInterface service;
Person p1 = new Person("Louis", "Armstrong"),
p2 = new Person("Neil", "Armstrong"),
p3 = new Person("Neil", "Tyson"),
p4 = new Person("Mike", "Tyson");
Optional<String> empty = Optional.empty();
@BeforeEach
public void beforeEach() {
service = new PersonService(new PersonRepositoryMemory());
}
@Test
public void join() {
Long id;
assertThat(p1.getId()).isNull();
service.join(p1);
assertThat(id = p1.getId()).isNotNull();
service.join(p1);
assertThat(id).isEqualTo(p1.getId());
}
@Test
public void getId() {
assertThat(service.getId(p2).isEmpty()).isTrue();
service.join(p2);
assertThat(service.getId(p2).isPresent()).isTrue();
assertThat(service.getId(p1).isEmpty()).isTrue();
assertThat(service.getId(new Person("Neil", "Armstrong")).isPresent()).isTrue();
}
@Test
public void search() {
assertThat(service.search(empty, empty).size()).isEqualTo(0);
service.join(p1);
service.join(p2);
service.join(p3);
assertThat(service.search(empty, empty).size()).isEqualTo(3);
assertThat(service.search(
Optional.ofNullable(p2.getFirst()),
empty).size()).isEqualTo(2);
assertThat(service.search(
empty,
Optional.ofNullable(p2.getLast())).size()).isEqualTo(2);
assertThat(service.search(
Optional.ofNullable(p2.getFirst()),
Optional.ofNullable(p2.getLast())).size()).isEqualTo(1);
}
@Test
public void change() {
service.join(p3);
assertThat(p3.getFirst()).isEqualTo(p3.getFirst());
service.change(p3, p4);
assertThat(service.search(
Optional.ofNullable(p3.getFirst()),
Optional.ofNullable(p3.getLast())).size()).isEqualTo(0);
assertThat(service.search(
Optional.ofNullable(p3.getFirst()),
empty).size()).isEqualTo(0);
assertThat(service.search(
empty,
Optional.ofNullable(p3.getLast())).size()).isEqualTo(1);
}
@Test
public void leave() {
service.join(p4);
assertThat(service.getId(p4).isPresent()).isTrue();
service.leave(p4);
assertThat(service.getId(p4).isEmpty()).isTrue();
}
}
'웹 > Spring' 카테고리의 다른 글
Spring 프로젝트에 Lombok 추가하기 (0) | 2022.04.09 |
---|---|
DB와 연결하기 (0) | 2022.03.22 |
Repository / Service / Controller (0) | 2022.03.17 |
Container와 Bean (0) | 2022.03.15 |
간단한 MVC 패턴과 API 만들기 (0) | 2022.03.10 |