HOWTO · Java

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

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

이 페이지의 내용

이 튜토리얼은 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을 반환해야 합니다.