>Java >java지도 시간 >PowerMock을 사용하여 테스트하기 위해 비공개 메서드를 어떻게 모의합니까?

PowerMock을 사용하여 테스트하기 위해 비공개 메서드를 어떻게 모의합니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-03 15:06:30314검색

How do I Mock Private Methods for Testing Using PowerMock?

PowerMock을 사용하여 테스트하기 위해 비공개 메소드 모의하기

비공개 메소드로 클래스를 테스트할 때 공개 메소드를 보장하기 위해 이러한 메소드를 모의해야 하는 경우가 종종 있습니다. API가 예상대로 작동합니다. 그러나 Mockito와 같은 프레임워크를 사용할 때는 그렇게 하는 것이 어려울 수 있습니다.

문제:

PowerMock을 사용하여 개인 메서드를 모의하려고 시도하는 동안, 특히 다음과 같은 경우 문제가 발생할 수 있습니다. 개인 메서드의 반환 값을 조작하고 싶습니다.

해결책:

PowerMock을 사용하여 테스트하기 위해 개인 메서드를 모의하려면 다음 단계를 따르세요.

  1. PowerMock API 가져오기: 테스트 클래스에 필요한 PowerMock 주석과 API를 포함합니다.

    <code class="java">import org.powermock.api.mockito.PowerMockito;
    import org.powermock.core.classloader.annotations.PrepareForTest;
    import org.powermock.modules.junit4.PowerMockRunner;
    import static org.mockito.Matchers.anyInt;
    import static org.mockito.Matchers.anyString;
    import static org.powermock.api.mockito.PowerMockito.when;
    import static org.powermock.api.support.membermodification.MemberMatcher.method;</code>
  2. 테스트를 위한 클래스 준비: 테스트 클래스에 @PrepareForTest 주석을 달고 모의하려는 비공개 메서드가 포함된 클래스를 지정합니다.

    <code class="java">@PrepareForTest(CodeWithPrivateMethod.class)</code>
  3. 스파이 인스턴스 생성: PowerMockito 사용 , 개인 메소드를 포함하는 클래스의 스파이 인스턴스를 생성하십시오.

    <code class="java">CodeWithPrivateMethod spy = PowerMockito.spy(new CodeWithPrivateMethod());</code>
  4. 모의 개인 메소드: 개인 메소드를 모의하려면 PowerMockito의 when 메소드를 사용하십시오. 클래스, 메서드 이름, 매개변수 유형 및 원하는 반환 값을 지정합니다.

    <code class="java">when(spy, method(CodeWithPrivateMethod.class, "doTheGamble", String.class, int.class))
     .withArguments(anyString(), anyInt())
     .thenReturn(true);</code>
  5. 공용 메서드 테스트: 개인 메서드를 호출하는 공용 메서드를 호출합니다. 모의된 반환 값을 기반으로 동작을 확인합니다.

    <code class="java">spy.meaningfulPublicApi();</code>

예:

개인 메소드 doTheGamble이 있는 다음 CodeWithPrivateMethod 클래스를 고려하세요. :

<code class="java">public class CodeWithPrivateMethod {
    public void meaningfulPublicApi() {
        if (doTheGamble("Whatever", 1 << 3)) {
            throw new RuntimeException("boom");
        }
    }
    private boolean doTheGamble(String whatever, int binary) {
        Random random = new Random(System.nanoTime());
        boolean gamble = random.nextBoolean();
        return gamble;
    }
}</code>

doTheGamble을 모의하고 항상 true를 반환하려면 다음 테스트를 작성합니다.

<code class="java">@RunWith(PowerMockRunner.class)
@PrepareForTest(CodeWithPrivateMethod.class)
public class CodeWithPrivateMethodTest {
    @Test(expected = RuntimeException.class)
    public void when_gambling_is_true_then_always_explode() throws Exception {
        CodeWithPrivateMethod spy = PowerMockito.spy(new CodeWithPrivateMethod());
        when(spy, method(CodeWithPrivateMethod.class, "doTheGamble", String.class, int.class))
            .withArguments(anyString(), anyInt())
            .thenReturn(true);
        spy.meaningfulPublicApi();
    }
}</code>

이렇게 하면 테스트를 위해 비공개 메서드를 효과적으로 모의할 수 있어 공개 메서드가 개인 메소드 구현이 변경되지 않은 경우에도 API는 올바르게 작동합니다.

위 내용은 PowerMock을 사용하여 테스트하기 위해 비공개 메서드를 어떻게 모의합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.