1. 단위 테스트 (Unit Test)

도입

단위테스트는 가장 작은 단위의 로직을 검증하는 테스트이다. 따라서, 외부 시스템이나 특정 기술에 의존하지 않는 독립적인 테스트를 의미한다. 즉, 메서드나 클래스와 같은 가장 작은 단위의 기능을 격리하여 검증하는 테스트로 도메인 테스트를 예시로 들 수 있다.

주의해야 할 점은 스프링 프레임워크와 같은 특정 기술에 의존성이 없으며, 순수 자바 코드로만 작성된 테스트이다. 따라서, 특정 로직이 의도대로 동작하는지 가장 빠르고 정확하게 확인할 수 있다.

물론 @Mockito 같은 Mock 객체 정도는 사용할 수 있다. 외부 계층에 의존하더라도, 테스트의 성격이 순수 해당 계층의 로직만 검증하는 것이라면, 단위 테스트로 이해하면 된다.

특징

일반적으로, 작은 단위 테스트부터 먼저 작성하고 넓은 범위의 통합테스트 순으로 작성하는 것이 안정적이다. 순수 비즈니스 로직의 검증이 우선되야 하며, 이후 여러 컴포넌트를 통합하거나, 프레임워크와 통합, 그리고 넓게는 DB와 같은 외부 시스템을 연결하는 테스트를 작성하는 순서로 진행하는 것이 문제의 원인을 파악하기 용이하다.

단위 테스트의 문제점, 외부 계층에 의존되는 경우

특정 객체가 독립적으로 모든일을 처리한다면, 문제가 없겠지만, 현실적으로 다른 객체와 메시지를 주고 받는 경우가 일반적이다. 예를 들어, AccountServiceaccountRepository.save()를 호출하고 결과 값을 전달 받는다.
이와 같이, 외부 계층에 의존하는 경우 단위 테스트에서는 MockBean이나 Fake와 같은 가짜 객체(stub)를 주입하여 어떤 결과를 반환하도록 답변을 지정해야 한다.

따라서, 외부 계층 의존이 코드상 존재하더라도, 단위테스트 일 수 있다. AccountServiceaccountRepository에 코드상 의존적이더라도, 실제 외부 협력 객체인 accountRepository를 사용하지 않았다면, 단위 테스트로 볼 수 있다.

대표 예시 케이스

도메인 테스트

class EventDateTest {

	@Test  
	@DisplayName("isPast — 자기 날짜가 now의 날짜보다 과거면 true (시각 무관)")  
	void isPast() {  
	    final EventDate date = new EventDate(LocalDate.of(2026, 5, 19));  
	
	    assertSoftly(softly -> {  
	        softly.assertThat(date.isPast(LocalDateTime.of(2026, 5, 18, 23, 59))).isFalse();  
	        softly.assertThat(date.isPast(LocalDateTime.of(2026, 5, 19, 0, 0))).isFalse();  
	        softly.assertThat(date.isPast(LocalDateTime.of(2026, 5, 19, 23, 59))).isFalse();  
	        softly.assertThat(date.isPast(LocalDateTime.of(2026, 5, 20, 0, 0))).isTrue();  
	    });}
}