[TDD] JUnit 테스트 입문 – Mockito로 실제 객체 vs Mock 비교

2025. 7. 11. 14:03·공부일기../Java

JUnit이란?

  • Java기반 오픈소스단위 테스트 프레임워크
  • JUnit이 제공하는 엔진이 `@Test` 붙은 메서드를 찾아 실행하고 성공·실패를 보고해 준다.

📍어노테이션

  • `@BeforeEach` / `@AfterEach` : 각 테스트 전후 반복 실행할 초기화·정리 로직
  • `@BeforeAll` / `@AfterAll` : 클래스 전체 처음·마지막에 단 한 번 실행
  • (`@DisplayName`, `@Nested` 등으로 가독성·구조화 지원)

 

📍 Assertion API

  • `Assertions.assertEquals(기대값, 실행)`
  • `Assertions.assertTrue(조건)`
  • `Assertions.assertThrows(Exception.class, () -> { … })`

 

📍 테스트 구조

  • 메서드 별로 “given–when–then” 패턴 적용

📍 의존성 주입

`testImplementation("org.springframework.boot:spring-boot-starter-test")`

 

 

 

 

Mockito란?

  • Java기반의 오픈소스테스트 프레임워크
  • 단위테스트에서 실제객체 대신 사용되는 모의(Mock)객체를 생성해서 테스트를 도와준다.
  • Mockito를 사용하면 테스트시 외부시스템이나 복잡한 의존성을 가진 진짜 객체대신(new로 주입) Mock(가짜객)을 사용하여 간단하게 개발할 수있다.
  • Stub기능 : Mockito에서 모의객체에서 메서드가 호출될때 반환되는 값을 직접 지정할 수가있다.
    아래의 코드처럼 내가 이 메서드를 호출하면 그냥 이렇게 대답해 ~ 하고 알려주는거다 ! 
PointHistory h1 = new PointHistory(1, 1, 500L, TransactionType.USE, System.currentTimeMillis());
PointHistory h2 = new PointHistory(2, 1, 2000L, TransactionType.CHARGE, System.currentTimeMillis());

given(pointService.getHistory(1L)).willReturn(List.of(h1, h2));

 

 

 

  • JUnit을 쓴다 = 테스트 클래스를 만들고 `@Test` 붙여서 실행하고, Assertions로 검증하고, 필요하면 `@BeforeEach` 등으로 준비·정리까지 처리하는 환경을 사용하는 것
  • Mockito를 쓴다 = JUnit이 실행해 주는 테스트 메서드 안에서 가짜(mock) 객체를 만들어 주입하고, 동작을 스텁(stub)하거나 호출을 검증하는 것

 

실제 객체 vs Mock 객체 비교

📍 실제객체 사용 시 

비지니스 로직과 종속 객체간의 실제 흐름을 테스트 할 수있다 -> 오류 조기 발견가능!

구현 코드가 바뀌면 테스트 코드가 바로 깨진다

의존성 생성이 번거롭다 (new를 직접해야하니까 모든 의존객체를 수동으로 해야한다)

 

📍 Mock객체 사용시

비지니스 로직을 분리해서 빠르게 검증가능하다. (서비스, 도메인 , 메서드)

특정 행동에서 특정 반환값으로 마음대로 테스트 검증이 가능하다

`@Mock` `@InjectMocjs`를 사용해서 의존성 생성이 자동화되어있다.

내부 호출구조가 변경되면 코드를 고쳐야한다 (테스트가 너무많은걸 알고있음 강결합~!!)

 

😒😒 ** 잘못안점..

mock객체를 쓴다고 스프링컨테이너를 다 실행해서 느린줄알았는데 

Mocito를 단독으로 쓰면 스프링컨테이너를 띄우지않기때문에 매우 빠르다!! 

`@SpringBootTest`, `@WebMvcTest` 같은 스프링 테스트 애노테이션을 사용해 컨테이너 전체 또는 웹 계층을 로드할 때이고, mock 자체가 느린 게 아니다.. !!! 

 

실제 객체는 통합테스트 관점 으로 의존성과 연동까지 검증할때 사용하고

Mock은 단위테스트 관점으로 격리된단위 검증을 하고싶을때 사용하는것같다.....

 

'공부일기.. > Java' 카테고리의 다른 글

[동시성] 자바 동시성 문제 정리: synchronized, DB 락, Redis 분산락 비교  (5) 2025.08.16
[TDD](TDD기반 서비스 개발 후) 회고 및 객체지향 설계 고민  (0) 2025.07.12
[TDD] TDD 테스트 방법론  (0) 2025.07.11
스트림(Stream) / Optional<T> / 람다  (0) 2025.07.03
객제지향 속성 (캡슐화,상속,추상화,다형성)  (0) 2025.06.20
'공부일기../Java' 카테고리의 다른 글
  • [동시성] 자바 동시성 문제 정리: synchronized, DB 락, Redis 분산락 비교
  • [TDD](TDD기반 서비스 개발 후) 회고 및 객체지향 설계 고민
  • [TDD] TDD 테스트 방법론
  • 스트림(Stream) / Optional<T> / 람다
s0-0mzzang
s0-0mzzang
공부한것을 기록합니다...
  • s0-0mzzang
    승민이의..개발일기..🐰
    s0-0mzzang
  • 전체
    오늘
    어제
    • 전체~ (108)
      • 마음가짐..! (10)
      • 공부일기.. (76)
        • weekly-log (6)
        • Spring (19)
        • Java (18)
        • DataBase (10)
        • git (2)
        • JPA (6)
        • kafka (1)
        • Backend Architecture (3)
        • Troubleshooting (삽질..ㅋ) (2)
        • Cloud (1)
        • Docker (2)
        • 알고리즘 (1)
        • 리액트 (2)
        • Infra (3)
      • 하루일기.. (22)
        • 그림일기 (8)
        • 생각일기 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    spring boot
    JPA
    항해플러스
    BufferedReader
    MySQL
    TDD
    SpringBoot
    ERD
    다짐
    React
    리팩토링
    ADC 환경
    Paging
    자바
    swagger
    StringTokenizer
    spring
    항해99
    인프라 기초
    스프링부트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
s0-0mzzang
[TDD] JUnit 테스트 입문 – Mockito로 실제 객체 vs Mock 비교
상단으로

티스토리툴바