Code/Test 12

[더 자바, 애플리케이션을 테스트하는 다양한 방법] 2. Mockito

백기선 님의 인프런 강의 "더 자바, 애플리케이션을 테스트하는 다양한 방법"를 정리한 글입니다. 1. 소개Java 계열에서 가장 많이 사용되는 Mock 프레임워크 (50%+) 구성 요소 Mock: 실제 객체처럼 동작하지만, 프로그래머가 행동을 제어할 수 있는 객체Mockito: Mock 객체를 쉽게 만들고, 조작하고, 검증할 수 있는 프레임워크 대체제EasyMockJMock 2. Mockito 시작하기Gradledependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' testImplementation 'org.mockito:mockito-core:5.12.0' testImplementation 'org.mocki..

Code/Test 2025.04.19

[더 자바, 애플리케이션을 테스트하는 다양한 방법] 1. JUnit 5

백기선 님의 인프런 강의 "더 자바, 애플리케이션을 테스트하는 다양한 방법"를 정리한 글입니다. 1. JUnit 5자바 개발자들이 가장 많이 사용하는 테스트 프레임워크. (93%의 자바 개발자가 JUnit 사용) 구조구성 요소설명Platform테스트 실행을 위한 런처 및 TestEngine API 제공JupiterJUnit 5의 주요 TestEngine 구현체VintageJUnit 4 및 3을 지원하는 TestEngine 구현체 시작하기plugins { id 'java'}group 'com.example'version '1.0-SNAPSHOT'sourceCompatibility = '1.8'repositories { mavenCentral()}dependencies { testImplem..

Code/Test 2025.04.19

[단위 테스트] 8-2. 통합 테스트를 하는 이유: 인터페이스

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다. 4. 의존성 추상화를 위한 인터페이스 사용인터페이스와 느슨한 결합인터페이스 사용의 잘못된 인식프로세스 외부 의존성을 추상화하는 목적은 느슨한 결합을 달성하기 위함단일 구현일 경우, 추상화가 아니게 됨진정한 추상화는 발견하는 것이지 발명하는 것이 아님 (적어도 구현이 두가지 이상 있어야 함)YAGNI 위반 프로세스 외부 의존성에 인터페이스를 사용하는 이유는?목을 사용하기 위함인터페이스가 없으면 테스트 대역을 만들 수 없음즉, 비관리 의존성만 인터페이스를 두기 5. 통합 테스트 모범 사례항목장점권장 사항도메인 모델 경계 명시단위 테스트와 통합 테스트 구분 쉬움 계층 수 줄이기단순화, 탐색 쉬움도메인 모델, 애플리케이션 서비스, 인프라 계층만..

Code/Test 2025.03.01

[단위 테스트] 5-2. 목과 테스트 취약성: 통신

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다.3. 목과 테스트 취약성 간의 관계육각형 아키텍처도메인을 중심으로, 포트(Port)와 어댑터(Adapter)를 통해 외부와의 상호작용을 처리하는 구조구성 요소설명Domain핵심 비즈니스 로직. 의존성 없음 (순수 계층)Port (Interface)외부와 상호작용하기 위한 입출력 인터페이스Adapter외부 시스템 구현체 (DB, Email, API 등)Application Service도메인 호출 + 외부 시스템과의 조율 담당 예제) Order더보기도메인public class Order { private String orderId; private String customerId; private List items; pr..

Code/Test 2025.01.24

[단위 테스트] 5-1. 목과 테스트 취약성: 목

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다. 1. Mock vs Stub테스트 대상 시스템과 그 협력자 사이의 상호 작용을 검사할 수 있는 테스트 대역구분Mock (목)Stub (스텁)역할외부와의 상호 작용을 모방하고 검증내부로 들어오는 입력/행위를 모방목적협력 객체가 정확히 호출되었는지협력 객체에서 예상 데이터 제공방향Out-boundIn-bound검증 여부✅ 상호작용 검증 (호출 횟수, 순서, 인자 등)❌ 결과 검증만적합한 상황부작용 발생 확인 (Command)데이터 주입 (Query)주의사항과도하면 구현에 종속됨상호작용 검증은 하지 말 것테스트 위험과잉 명세구현 세부사항 노출예시이메일 전송 여부, 결제 API 호출 여부 등DB에서 회원 조회 결과 반환, 외부 API에서 응답 ..

Code/Test 2025.01.24

[단위 테스트] 4-2. 좋은 단위 테스트의 4대 요소: 이상적인 테스트

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다.3. 이상적인 테스트를 찾아서테스트의 가치좋은 단위 테스트의 4대 특성을 곱하여 얻은 결과 (추정치)소수의 가치있는 테스트가 평범한 테스트보다 프로젝트 성장에 훨씬 더 효과적테스트 스위트에 테스트를 계속 둘지 여부를 결정할 수 있음임계치를 충족하는 테스트만 두어, 책임을 적절하게 맡도록 해야 함 이상적인 테스트를 만들 수 있는가?이상적인 테스트는 네 가지 특성 모두에서 최대 점수를 받는 테스트실제로는 세 가지 특성(회귀 방지, 리팩터링 내성, 빠른 피드백)이 서로 충돌함 모두를 동시에 만족하는 것은 불가능함 핵심 전략항목설명하나의 특성을 완전히 버릴 수 없다하나를 버리면 곱셈 규칙(가치의 곱)에 의해 전체 테스트의 유용성이 0에 가까워짐리..

Code/Test 2025.01.24

[단위 테스트] 4-1. 좋은 단위 테스트의 4대 요소: 4대 요소

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다.1. 좋은 단위 테스트의 4대 요소요소설명문제 상황 / 원인해결 방안회귀 방지코드 수정 후 기능이 깨지는 것을 방지하는 테스트 역할코드 수정 후 테스트는 통과하지만 실제로는 동작하지 않음기존 동작을 명확히 검증리팩터링 내성코드 내부 구현이 변경되어도 테스트가 정상적으로 동작해야 함리팩토링 시 내부 동작 테스트 깨짐결과 기반 테스트구현 디테일 분리빠른 피드백테스트가 빠르게 실행되어야 실시간 피드백이 가능외부 의존성으로 느려지거나 무거워짐의존성 분리 (Fake/Stub)유지 보수성가독성, 유지 비용, 실행 비용 등을 평가 └ 이해 난이도테스트가 얼마나 직관적이고 쉽게 읽히는가복잡한 준비 코드AAA 패턴 사용설명적인 테스트 이름└ 실행 난이도..

Code/Test 2025.01.19

[단위 테스트] 3. 단위 테스트 구조

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다.1. AAA 패턴테스트 코드를 세 단계로 구분하여 작성하는 패턴스위트 내 모든 테스트가 단순하고 균일한 구조를 갖게함단계설명Arrange테스트 대상(SUT) 및 의존성 설정Act테스트 대상 메서드 실행Assert결과 확인 (반환 값, 상태 변화, 호출 여부 등) 2. 권장 사항항목권장 사항이유 및 설명구절 수 제한한 테스트에는 한 act만단일 동작 검증조건문 회피분기문 피하기 (if, switch 등)복잡도 증가 (한 테스트에 여러 경우를 넣지 말고 분리해야 함)메서드 캡슐화복잡한 검증 로직 분리 (private 메서드로)반복 제거가독성 향상목적 명확화불변 위반 방지여러 호출로 결과 만들지 말 것불변성 깨질 수 있음 (한 동작 = 한 결과..

Code/Test 2025.01.07

[단위 테스트] 2-2. 단위 테스트란 무엇인가: 런던파와 고전파

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다. 2. 런던파와 고전파격리 방식에 따라 크게 두 가지 스타일로 나뉨항목런던파 (London School)고전파 (Classical School)중심 철학상호작용 기반 (행위 검증)상태 기반 (결과 검증)테스트 단위코드 조각단일 동작TDD 방식하향식 (전체 설계/인프라 → 상위 → 하위)상향식 (하위 → 상위 → 전체 설계/인프라)의존성 처리모든 의존성을 Mock으로 대체공유 의존성만 Fake/Stub으로 격리 (나머지는 실제 객체 사용)장점빠르고 정밀함현실적인 테스트단점과잉 명세구현 의존성 높음문제 원인 추적이 어려움 예제) EmailSender더보기런던파// 인터페이스public interface EmailSender { void ..

Code/Test 2025.01.07

[단위 테스트] 2-1. 단위 테스트란 무엇인가: 단위 테스트란

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다.1. '단위 테스트'의 정의작은 코드 조각을 대상으로, 독립적으로 빠르게 검증하는 테스트 격리성독립적으로 실행 가능한 상태✅ 실행 환경이나 다른 테스트에 영향받지 않음✅ 순서에 의존하지 않아야 함 2. 의존성내 코드가 직접 사용하지만, 내가 직접 구현하지 않은 것 (외부에 기대는 요소)✅ 단위 테스트의 격리성을 보장하기 위해 실제 의존성과 함께 동작하지 않음➡️ 테스트 대역으로 대체하여 핵심 로직만 집중적으로 검증의존성 종류설명문제점예시해결 방법공유 의존성테스트 간에 공유되는 상태테스트 간 간섭 발생- 정적 가변 필드- 싱글턴- 전역 변수- 공유 제거- 테스트마다 초기화비공개 의존성코드에 드러나지 않는 숨은 의존성실패 원인 파악 어려움- ..

Code/Test 2025.01.07