개발일기/CS(면접)

Junit5, Mockito 사용하기

w.llama 2024. 9. 30. 18:24

Junit5 란?

-  java 에서 독립된 단위 테스트를 지원해주는 프레임워크 / java 8버전 이상

- Junit 5 = Junit platform(테스트 실행환경)
               + Junit jupiter(프레임워크)
               + Junit vintage(Junit4와 하위 호환을 제공하기 위한 모듈)

단위테스트란?

- 소프트웨어 개발에서 개별적 코드단위를 테스트하는 것을 의미함 ( 클래스 , 메서드 , 함수 등등 과같은 작은 단위)

- 컨트롤러단이나 서비스단과 같은 구성요소는 각각 개별적인 단위로 테스트 될 수 있다.

 

Junit5  주요 어노테이션

@Test - 테스트 메서드를 정의하는데 사용되는 어노테이션

@ParameterizedTest - 매개변수화된 테스트를 정의하는데 사용되는 어노테이션

@BeforeEach - 각각의 테스트 메서드가 실행되기전 실행되는 코드

@ AfterEach - 각각의 테스트 메서드가 실행 된 후 실행되는 코드

@BeforeAll - 모든 테스트 메소드 실행 전 실행되는 코드

@AfterAll -  모든 테스트 메소드 실행 후 실행되는 코드

@DisplayName - 테스트의 표시 이름을 설정하는 어노테이션

@Nested - 중첩된 클래스를 정의하는 어노테이션 (그룹화)

@Order(숫자) -  (숫자)순서대로 테스트를 진행

@TestClassOrder - 테스트 클래스의 실행순서를 지정하는 어노테이션

@TestMethodOrder - 테스트 메소드의 실행순서를 지정하는 어노테이션

@RepeatedTest - 반복적으로 실행되는 테스트를 위한 어노테이션

@Timeout - 테스트의 제한시간을 설정

@Nested
@DisplayName("주제 별로 테스트를 그룹지어서 파악하기 좋습니다.")
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class Test1 {

    @Order(1)
    @Test
    @DisplayName("Test1 클래스")
    void test() {
        System.out.println("\nTest1 클래스");
    }

    @Order(3)
    @Test
    @DisplayName("Test1 - test1()")
    void test1() {
        System.out.println("Test1.test1");
    }

    @Order(2)
    @Test
    @DisplayName("Test1 - test2()")
    void test2() {
        System.out.println("Test1.test2");
    }
}

Junit5 라이프 사이클 수행과정

  1. @BeforeAll - Junit 클래스가 실행되면 최초 한번 @BeforeAll어노테이션을 선언한 메서드가 실행
  2. @BeforeEach - @Test를 찾았다면 테스트 실행전 @BeforeEach를 선언한 메서드가 실행
  3. @Test - @Test를 선언한 메서드가 실행
  4. @AfterEach - 실행을 마치면 @AfterEach를 선언한 메서드가 시랭
  5. @AfterAll - 2.3.4번을 반복 더이상 Test가 없으면 @AfterAll을 선언한 메서드를 수행 후 테스트 종

코드 사용 방법 

  •  AAA ( Arrange - Act - Assert) 패턴
     Arrange(준비) - 테스트에 필요한 객체,데이터 설정하는 단계로 테스트하려는 객체를 생성하고 모든 의존성을 준비
    Act(실행) - 준비된 객체나 데이터를 사용하여 실제로 테스트하려는 동작을 실행하는 단계
    Assert(검증) - 실행결과가 예상한 대로인지 확인하는 단계. Junit의 assert 메서드를 사용하여 결과를 검증
  •  Given-When-Then 패턴
    Given (설정) - 테스트의 초기 상태 또는 사전 조건을 설정, 입력데이터나 테스트가 실행될 문맥을 지정
    When (동작) - 테스트되는 동작 또는 이벤트를 설명, 테스트되는 특정 메서드나 동작을 나타냄
    Then (검증) - "When"단계 에서 설명한 동작으로 인해 기대되는 결과 또는 동작을 정의

Mockito란?

Mockito는 단위 테스트에서 의존성을 가진 객체들을 실제 객체 대신 "가짜(Mock)" 객체로 대체하여 테스트를 할 수 있게 해주는 프레임워크이. Service, Controller, Repository 클래스는 종종 서로 의존성이 깊어 독립적인 테스트가 어려울 수 있는데, Mockito를 사용하면 이러한 의존성을 분리하여 특정 클래스만 독립적으로 테스트할 수 있다.

Mockito 사용법

  1. @ExtendWith(MockitoExtension.class)
    테스트 클래스 상단에 @ExtendWith(MockitoExtension.class)를 붙여서 Mockito 기능을 활성화합니다.
  2. @Mock 어노테이션
    @Mock 어노테이션을 사용하여 필요한 의존성 객체를 가짜로 생성합니다.
    이 객체는 실제 객체와 같은 메소드와 동작을 가지지만, 실제로는 동작하지 않고 테스트에 필요한 값을 반환하도록 설정할 수 있습니다.
  3. DB와 같은 외부 의존성을 가짜로 처리
    예를 들어, 실제 DB 작업을 수행하지 않고도 마치 수행한 것처럼 가짜 객체에서 미리 정의한 결과를 반환하게 할 수 있습니다. 이는 테스트의 독립성을 보장하고 테스트 속도를 높입니다.
  4. 필요한 메소드의 동작 정의 (Stubbing)
    when(...).thenReturn(...) 또는 doReturn(...).when(...)과 같은 방식을 사용하여 테스트에 필요한 가짜 객체의 동작을 정의합니다. 이를 통해 테스트 시 특정 상황에서의 결과를 제어할 수 있습니다.

Controller 테스트 방법

Spring Security를 사용하는 애플리케이션에서는 Controller를 테스트할 때 인증 및 권한 처리 때문에 Spring Security 필터가 개입되어 테스트에 어려움을 겪을 수 있다.
 이를 해결하기 위해 MockSpringSecurityFilter를 사용하거나, Spring Security에서 제공하는 다양한 방법들을 통해 실제 인증 과정을 무시하거나 간소화한 상태에서 Controller 테스트를 진행할 수 있다.그 방법은 다음과 같다

  1. @WithMockUser - 기본적인 가짜 사용자 정보를 주입하여 테스트.
  2. SecurityMockMvcRequestPostProcessors - 좀 더 구체적인 사용자 정보 설정 가능.
  3. @MockBean을 사용한 SecurityFilterChain 대체 - 필터 체인을 완전히 무시하고 테스트.
  4. @AutoConfigureMockMvc와 @SpringBootTest - 통합 테스트를 하면서도 인증을 우회.

참조 - JUnit5 공식 사이트

 

JUnit 5 User Guide

Although the JUnit Jupiter programming model and extension model do not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and custo

junit.org

참조 - JUnit5 블로그

 

[Java] Spring Boot JUnit5 이해하기 -1 : 이론 및 구조

해당 글에서는 Spring Boot 환경에서 JUnit에 대해 이해하고 환경을 구성하는 방법에 대해 알아봅니다. 💡 [참고] 이전에 작성한 Test 관련 글들을 읽으시면 도움이 됩니다.분류링크JUnit 5 이론 및 구

adjh54.tistory.com

 

참조 - Mockito 블로그-1

 

Mockito를 활용하여 테스트 코드 작성하기

Mockito 란? Mockito란 Java 오픈소스 테스트 프레임워크입니다. Mockito를 사용하면 실제 객체를 모방한 가짜 객체, Mock 객체 생성이 가능해집니다. 개발자는 이 Mock 객체를 통해 테스트를 보다 간단하

www.nextree.io

참조 - Mockito 블로그-2

 

Mockito 프레임 워크

모두 현업에서든, 개인 프로젝트에서든 테스트코드 열심히 작성하고 계신가요? Mockito 프레임워크에 대해서 정리해봅니다!

velog.io

참조 - Mockito 공식문서

 

Mockito - mockito-core 5.14.1 javadoc

Latest version of org.mockito:mockito-core https://javadoc.io/doc/org.mockito/mockito-core Current version 5.14.1 https://javadoc.io/doc/org.mockito/mockito-core/5.14.1 package-list path (used for javadoc generation -link option) https://javadoc.io/doc/org

javadoc.io

 

 

'개발일기 > CS(면접)' 카테고리의 다른 글

Scanner 차이 BufferedReader  (0) 2024.12.18
자료구조 정리  (0) 2024.10.19
Spring Security 동작 과정  (0) 2024.09.24
HTTPS 란?  (0) 2024.09.12
공간 복잡도란?  (0) 2024.09.10