Mockito를 사용하여 Java의 정적 메소드 모의하기

Sheeraz Gul 2023년10월12일
Mockito를 사용하여 Java의 정적 메소드 모의하기

이 튜토리얼은 mockito를 사용하여 Java의 정적 메서드를 조롱하는 방법을 보여줍니다.

Java의 모의 정적 메서드

Mocking Static Methods는 Java에서 단위 테스트를 수행할 때 필요합니다. Mockito 3.4.0 버전 이전에는 PowerMock을 사용하여 정적 및 개인 메서드를 조롱해야 합니다.

Mockito 3.4.0을 사용하면 정적 메서드를 직접 조롱할 수 있습니다. 이 자습서는 Java에서 mockito를 사용하여 정적 메서드를 모의하는 방법을 보여줍니다.

Maven 종속성 추가

mockito를 시작하기 전에 시스템에 추가해야 합니다. 정적 메서드를 모의하려면 mockito 인라인 모의에서 인라인 모의 만들기가 필요합니다.

mockito-inline은 정적 메서드에 대한 조롱 기능을 제공하는 커뮤니티 피드백과 이전에는 조롱할 수 없었던 최종 클래스를 위해 별도로 개발되었습니다. 다음은 mockito 인라인 조롱에 대한 maven 종속성입니다.

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-inline</artifactId>
    <version>4.6.1</version>
    <scope>test</scope>
</dependency>

maven 시스템의 pom.xml에 이 종속성을 추가하면 됩니다.

Mockito 인라인 목킹을 사용하는 다양한 코드 예제

먼저 모의 정적 메서드에 적용할 수 있는 시스템을 결정해 보겠습니다. 인수가 있는 메서드와 인수가 없는 메서드가 있는 간단한 클래스를 만들어 보겠습니다. 예 참조:

package delftstack;

import java.util.stream.IntStream;

class Mock_Static_Method {
  public static String get_Value() {
    return "delftstack";
  }

  public static int addition(int... args) {
    return IntStream.of(args).sum();
  }
}

위의 코드에는 두 가지 메서드가 있는 간단한 클래스가 포함되어 있습니다.

  1. 첫 번째 방법은 delftstack 값을 반환하고 인수를 사용하지 않습니다.
  2. 두 번째 방법은 인수를 받아 합계를 반환합니다.

모의 정적 클래스

정적 메서드를 조롱하기 전에 정적 클래스를 조롱해야 합니다. 다음은 Java에서 mockito를 사용하여 정적 클래스를 조롱하는 방법에 대한 코드 예제입니다.

try (MockedStatic Mock_Static_Class = mockStatic(AppStatic.class)) {
  // Here, we can record mock expectations, test code, and verify mock
}

위 코드에서 MockedStatic은 정적 메서드 유형의 범위가 지정되고 활성 모의 객체를 나타냅니다. mockStatic은 정적 메서드 호출을 확인하는 데 사용됩니다.

인수가 없는 모의 정적 방법

인수를 받지 않고 delftstack 값을 반환하는 첫 번째 메서드인 get_Value()를 조롱해 봅시다. get_Value() 메서드를 조롱하고 delftstack1 값을 반환하려고 합니다. 예를 참조하십시오.

@Test
public void Testing_Get_Value() {
  // Outside the scope
  assertEquals("delftstack", Mock_Static_Method.get_Value());

  try (MockedStatic Mock_Static = mockStatic(Mock_Static_Method.class)) {
    Mock_Static.when(Mock_Static_Method::get_Value).thenReturn("delftstack1");

    // Inside the scope
    assertEquals("delftstack1", Mock_Static_Method.get_Value());
    Mock_Static.verify(Mock_Static_Method::get_Value);
  }

  // Outside the scope
  assertEquals("delftstack", Mock_Static_Method.get_Value());
}

위의 코드는 정적 메서드 get_Value(),를 모의하고 이제 범위 외부에서 메서드는 delftstack을 반환하고 범위 내에서 delftstack1을 반환합니다.

인수가 있는 모의 정적 방법

인수가 있는 정적 메서드를 조롱하는 것과 인수가 없는 정적 메서드를 조롱하는 것에는 큰 차이가 없습니다.

인수를 사용하여 정적 메서드를 모의하기 위해 예상 및 람다 식에서 유연한 인수 일치를 사용하여 메서드를 호출할 수 있습니다. 예를 참조하십시오:

@Test
public void Testing_Addition() {
  assertEquals(3, Mock_Static_Method.addition(1, 2));

  try (MockedStatic Mock_Static = mockStatic(Mock_Static_Method.class)) {
    Mock_Static.when(() -> Mock_Static_Method.addition(anyInt(), anyInt())).thenReturn(10);

    assertEquals(10, Mock_Static_Method.addition(1, 2));
    Mock_Static.verify(() -> ClassWithStaticMethod.addition(1, 2));
  }

  assertEquals(3, Mock_Static_Method.addition(1, 2));
}

위의 코드는 위 코드의 인수를 사용하여 정적 메서드를 조롱합니다.

위의 코드는 주어진 인수의 합계를 계산하는 데 사용되는 IntStream.of(args).sum()을 조롱하므로 주어진 인수의 합계를 반환합니다. 범위 밖에서 메서드는 합계 3을 반환하고 범위 내에서 값 10을 반환해야 합니다.

작가: Sheeraz Gul
Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook