it-source

PowerMockito 모의 단일 정적 메서드 및 반환 객체

criticalcode 2022. 10. 30. 11:09
반응형

PowerMockito 모의 단일 정적 메서드 및 반환 객체

m1과 m2의 2개의 정적 메서드를 포함하는 클래스에서 정적 메서드 m1을 조롱하고 싶습니다.그리고 메서드 m1이 오브젝트를 반환하고 싶다.

나는 다음을 시도했다.

1)

PowerMockito.mockStatic(Static.class, new Answer<Long>() {
         @Override
         public Long answer(InvocationOnMock invocation) throws Throwable {
            return 1000l;
         }
      });

이것은 m1과 m2를 모두 호출하고 있으며 반환 타입이 다르기 때문에 반환 타입 불일치 에러가 발생합니다.

2)PowerMockito.when(Static.m1(param1, param2)).thenReturn(1000l);그러나 m1이 실행될 때는 호출되지 않습니다.

3)PowerMockito.mockPartial(Static.class, "m1");컴파일러에 mockPartial을 사용할 수 없다는 오류가 나타납니다.이 에러는 http://code.google.com/p/powermock/wiki/MockitoUsage 에서 입수했습니다.

원하는 것은 1의 일부와 2의 모든 부분을 조합하는 것입니다.

PowerMockito.mockStatic을 사용하여 클래스의 모든 정적 메서드에 대해 정적 모킹을 활성화해야 합니다.즉, when-then Return 구문을 사용하여 스터브할 수 있습니다.

그러나 사용하고 있는 mockStatic의 2인수 오버로드로 인해 모크 인스턴스에서 명시적으로 stubbed하지 않은 메서드를 호출했을 때 Mockito/PowerMock이 수행해야 하는 기본 전략이 제공됩니다.

javadoc에서:

상호 작용에 대한 응답에 대해 지정된 전략으로 클래스 모크를 만듭니다.이것은 꽤 고도의 기능으로, 통상, 적절한 테스트를 작성하기 위해서 필요한 것은 아닙니다.다만, 레거시 시스템으로 작업할 때는 도움이 됩니다.이것은 기본 응답이므로 메서드콜을 stub하지 않을 때만 사용됩니다.

기본 스터브 전략은 오브젝트, 번호 및 부울 값 메서드에 대해 null, 0 또는 false만 반환하는 것입니다.2-arg 오버로드를 사용하면 "No, no, no, default use this Answer subclass' answer method를 사용하여 기본값을 가져옵니다.Long이 반환되므로 Long과 호환되지 않는 것을 반환하는 정적 메서드가 있으면 문제가 있습니다.

대신 mockStatic의 1-arg 버전을 사용하여 스태틱 방식의 스터브를 이노블로 한 후 when-then-Return을 사용하여 특정 방식에 대해 수행할 작업을 지정합니다.예를 들어 다음과 같습니다.

import static org.mockito.Mockito.*;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

class ClassWithStatics {
  public static String getString() {
    return "String";
  }

  public static int getInt() {
    return 1;
  }
}

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithStatics.class)
public class StubJustOneStatic {
  @Test
  public void test() {
    PowerMockito.mockStatic(ClassWithStatics.class);

    when(ClassWithStatics.getString()).thenReturn("Hello!");

    System.out.println("String: " + ClassWithStatics.getString());
    System.out.println("Int: " + ClassWithStatics.getInt());
  }
}

String-value static 메서드는 stubbed되어 "Hello!"가 반환됩니다.int-value static 메서드는 기본 stubbing을 사용하며 0이 반환됩니다.

언급URL : https://stackoverflow.com/questions/10583202/powermockito-mock-single-static-method-and-return-object

반응형