본문 바로가기
Everyday Study

2024.08.22(목) { Qualified Name, @DirtiesContext, 체이닝 메서드, MOCK }

by xogns93 2024. 8. 22.

Qualified Name

 

Qualified Name은 어떤 엔티티(클래스, 메서드, 변수 등)를 정확하게 식별하기 위해 전체 경로를 포함한 이름을 말합니다. 특히 클래스의 패키지 이름까지 포함하여 사용하는 경우가 많습니다.

 

// Fully Qualified Name을 사용한 클래스 선언
java.util.List<String> list = new java.util.ArrayList<>();

위 예제에서 java.util.List java.util.ArrayList Fully Qualified Name입니다. 이들은 각각 List 인터페이스와 ArrayList 클래스가 java.util 패키지에 속해 있음을 나타냅니다.

 

Fully Qualified Class Name (완전히 자격 있는 클래스 이름)

클래스를 명확히 식별하기 위해 패키지 이름까지 포함한 클래스 이름을 말합니다. 이는 중복된 클래스 이름을 가진 여러 패키지들 간의 충돌을 방지합니다.

 

 


DirtiesContext

 

DirtiesContext는 Spring Framework에서 제공하는 테스트 관련 애노테이션입니다. 이 애노테이션은 테스트 실행 후에 Spring의 애플리케이션 컨텍스트를 "더럽혀졌다"라고 표시하여, 이후의 테스트에서 해당 컨텍스트를 다시 로드하도록 합니다. 이 애노테이션을 사용하면, 테스트 간에 상태가 공유되지 않도록 보장할 수 있습니다.

 

주요 개념 및 사용법

1. 애노테이션 사용

@DirtiesContext는 테스트 클래스나 테스트 메서드에 적용할 수 있습니다.

 

2. 클래스 레벨 적용

클래스 레벨에 @DirtiesContext를 적용하면, 해당 클래스 내의 모든 테스트 메서드가 실행된 후에 애플리케이션 컨텍스트가 "더럽혀졌다"고 간주됩니다.

 

사용 목적

@DirtiesContext는 다음과 같은 경우에 유용합니다:

  • 테스트 메서드가 애플리케이션 컨텍스트를 변경하거나 더럽힐 가능성이 있는 경우.
  • 여러 테스트 메서드가 같은 컨텍스트를 공유하지 않고 독립적으로 실행되기를 원하는 경우.
  • 테스트 간에 애플리케이션 상태를 초기화해야 하는 경우.

체이닝 메서드(Method Chaining)

 

체이닝 메서드(Method Chaining)는 객체 지향 프로그래밍에서 여러 메서드 호출을 하나의 문장에서 연결(chain)하여 수행하는 기법입니다. 이 방식은 가독성을 높이고, 객체의 상태를 연속적으로 수정하거나 작업을 수행하는 데 유용합니다.

개념 설명

체이닝 메서드는 일반적으로 각 메서드가 객체 자신(this)을 반환하도록 구현되어 있습니다. 이렇게 하면 여러 메서드를 순차적으로 호출할 수 있으며, 각각의 메서드 호출이 끝나면 동일한 객체가 반환되어 다음 메서드를 이어서 호출할 수 있습니다.

 

 

예시 코드 :

public class Person {
    private String name;
    private int age;

    public Person setName(String name) {
        this.name = name;
        return this; // 현재 객체를 반환하여 메서드 체이닝을 가능하게 함
    }

    public Person setAge(int age) {
        this.age = age;
        return this; // 현재 객체를 반환하여 메서드 체이닝을 가능하게 함
    }

    public void introduce() {
        System.out.println("Hi, my name is " + name + " and I am " + age + " years old.");
    }
}

 

체이닝 메서드 사용

public class Main {
    public static void main(String[] args) {
        Person person = new Person();

        // 체이닝 메서드를 사용하여 메서드를 연속적으로 호출
        person.setName("Alice")
              .setAge(30)
              .introduce();
    }
}
Hi, my name is Alice and I am 30 years old.

 

장점

  1. 가독성 향상: 여러 메서드 호출을 한 줄로 작성할 수 있어 코드가 간결해집니다.
  2. 코드의 일관성: 동일한 객체에 대해 연속적인 작업을 수행하는 경우, 체이닝 메서드는 자연스럽고 논리적인 흐름을 제공합니다.
  3. 유연한 설계: 객체의 상태를 순차적으로 설정하거나, 다양한 작업을 체계적으로 수행할 수 있습니다.

단점

  1. 디버깅 어려움: 모든 메서드가 같은 라인에 있을 경우, 디버깅이 다소 어려울 수 있습니다.
  2. 에러 핸들링: 메서드 체이닝 중간에 에러가 발생하면 전체 체인이 실패할 수 있으며, 이를 처리하는 방식이 복잡해질 수 있습니다.

실용적 사용 예

체이닝 메서드는 빌더 패턴(Builder Pattern)에서 자주 사용됩니다. 예를 들어, 복잡한 객체를 생성할 때 체이닝 메서드를 활용하여 각 속성을 설정하는 코드를 간결하게 작성할 수 있습니다.

 


Mock

 

Mock은 소프트웨어 테스트에서 사용하는 중요한 개념입니다. 주로 단위 테스트(unit test)에서 사용되며, 실제 객체 대신 가짜(mock) 객체를 만들어 특정 조건이나 동작을 시뮬레이션하는 데 사용됩니다. 이를 통해 테스트 대상 코드의 의존성을 분리하고, 독립적으로 테스트할 수 있게 해줍니다.

Mock의 주요 개념

  1. 의존성 격리: 테스트하려는 대상이 다른 클래스나 시스템에 의존할 경우, 이 의존성을 무시하고 독립적으로 테스트하기 위해 Mock 객체를 사용합니다.
  2. 가짜 객체: Mock은 실제 객체처럼 행동하지만, 실제로는 테스트를 위해 특정 동작이나 데이터를 시뮬레이션하는 객체입니다.
  3. 테스트 단순화: 외부 시스템(예: 데이터베이스, 네트워크, 파일 시스템 등)과의 상호작용을 테스트할 때 복잡성을 줄이고, 테스트가 더 간단하고 빠르게 실행되도록 도와줍니다.

Mock의 사용 예

Java에서 Mock을 사용하기 위해서는 Mockito 같은 라이브러리를 사용할 수 있습니다. Mockito는 Java에서 가장 널리 사용되는 Mocking 프레임워크입니다.


Mockito의 when-then 구조

 

Mockito에서 when-then 구조는 Stub 동작을 정의하는 데 사용됩니다. 이는 특정 메서드가 호출될 때 어떤 동작을 수행할지 미리 정의하는 방식입니다. 이를 통해 테스트 중에 메서드가 호출될 때 반환값을 제어하거나 예외를 던질 수 있습니다.

 

기본구조

when(메서드 호출).thenReturn(리턴 값);

특정 메서드가 호출되었을 때, 어떤 값을 반환할지 설정하는 방식

 

다양한 then 메서드들

thenReturn 외에도 다양한 then 메서드들이 있습니다:

 

 

thenThrow

  • 특정 메서드 호출 시 예외를 던지도록 설정합니다.
when(mockRepository.findUserNameById(1)).thenThrow(new RuntimeException("User not found"));

 

thenAnswer

  • 호출된 메서드의 인수나 호출된 횟수에 따라 동적으로 반환값을 설정할 수 있습니다.
when(mockRepository.findUserNameById(anyInt())).thenAnswer(invocation -> {
    int id = invocation.getArgument(0);
    return "User" + id;
});

 

thenCallRealMethod

  • Mock 객체에 대한 호출이 실제 객체의 메서드를 호출하도록 설정합니다. Mock 객체이지만 특정 메서드는 원래 동작을 수행하도록 하고 싶을 때 사용합니다.
when(mockRepository.findUserNameById(1)).thenCallRealMethod();

ArgumentCaptor

 

 

  • **ArgumentCaptor**는 Mockito에서 메서드 호출 시 전달된 인수를 캡처하여 검증하거나 사용할 수 있게 하는 도구입니다.
  • 주로 verify 메서드와 함께 사용되어, 메서드가 올바르게 호출되었는지 검증할 수 있습니다.
  • capture() 메서드로 인수를 캡처하고, getValue() 또는 getAllValues() 메서드로 캡처된 값을 가져와 검증할 수 있습니다.
  • 단일 호출뿐만 아니라, 여러 번 호출된 메서드의 인수도 모두 캡처할 수 있어 복잡한 시나리오에서도 유용하게 사용할 수 있습니다.