PowerMock을 사용하여 테스트하기 위해 비공개 메소드 모의하기
비공개 메소드로 클래스를 테스트할 때 공개 메소드를 보장하기 위해 이러한 메소드를 모의해야 하는 경우가 종종 있습니다. API가 예상대로 작동합니다. 그러나 Mockito와 같은 프레임워크를 사용할 때는 그렇게 하는 것이 어려울 수 있습니다.
문제:
PowerMock을 사용하여 개인 메서드를 모의하려고 시도하는 동안, 특히 다음과 같은 경우 문제가 발생할 수 있습니다. 개인 메서드의 반환 값을 조작하고 싶습니다.
해결책:
PowerMock을 사용하여 테스트하기 위해 개인 메서드를 모의하려면 다음 단계를 따르세요.
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>
테스트를 위한 클래스 준비: 테스트 클래스에 @PrepareForTest 주석을 달고 모의하려는 비공개 메서드가 포함된 클래스를 지정합니다.
<code class="java">@PrepareForTest(CodeWithPrivateMethod.class)</code>
스파이 인스턴스 생성: PowerMockito 사용 , 개인 메소드를 포함하는 클래스의 스파이 인스턴스를 생성하십시오.
<code class="java">CodeWithPrivateMethod spy = PowerMockito.spy(new CodeWithPrivateMethod());</code>
모의 개인 메소드: 개인 메소드를 모의하려면 PowerMockito의 when 메소드를 사용하십시오. 클래스, 메서드 이름, 매개변수 유형 및 원하는 반환 값을 지정합니다.
<code class="java">when(spy, method(CodeWithPrivateMethod.class, "doTheGamble", String.class, int.class)) .withArguments(anyString(), anyInt()) .thenReturn(true);</code>
공용 메서드 테스트: 개인 메서드를 호출하는 공용 메서드를 호출합니다. 모의된 반환 값을 기반으로 동작을 확인합니다.
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!