2011-02-01 3 views
12

가 나는 일부 정적 메서드를 조롱 할 필요가 PowerMock 1.4.7 및 JUnit을 4.8.2PowerMock : 정적 메서드의 조롱 (+ 어떤 특별한 방법으로 원래의 값을 반환)

를 사용하고 난 에서 (다른 사람을 원한다 같은 클래스) 원래 값을 반환합니다. mockStatic으로 조롱하고 when().doReturn()을 호출하지 마십시오. 정적 메서드는 객체 을 반환 할 때 null 또는 부울을 반환 할 때 false를 반환합니다. 그래서 thenCallRealMethod을 각 정적 메서드에 명시 적으로 사용하려고 시도합니다. 기본 구현 (조롱/가짜 없음을 의미)하지만 모르겠습니다. 가능한 모든 인수 변형에 대해 호출하는 방법 (= 가능한 모든 입력 호출을 원합니다. 원래 방법). 나는 단지 구체적인 변이 변화를 조롱하는 방법을 안다.

답변

27

당신은 당신의 정적 클래스 및 모의 특정 방법에 스파이를 사용할 수 있습니다

stub(method(MyStaticClass.class, "getB")).toReturn("B"); 

편집 :

stub를 사용하려면

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MyStaticTest.MyStaticClass.class) 
public class MyStaticTest { 

public static class MyStaticClass { 
    public static String getA(String a) { 
     return a; 
    } 
    public static String getB(String b) { 
     return b; 
    } 
} 

@Test 
public void should_partial_mock_static_class() throws Exception { 
    //given 
    PowerMockito.spy(MyStaticClass.class); 
    given(MyStaticClass.getB(Mockito.anyString())).willReturn("B"); 
    //then 
    assertEquals("A", MyStaticClass.getA("A")); 
    assertEquals("B", MyStaticClass.getA("B")); 
    assertEquals("C", MyStaticClass.getA("C")); 
    assertEquals("B", MyStaticClass.getB("A")); 
    assertEquals("B", MyStaticClass.getB("B")); 
    assertEquals("B", MyStaticClass.getB("C")); 
} 

} 
+1

이 방법이 효과가 있지만 일치하는 인수를 사용할 때는주의해야합니다. _Mockito.any() _를 사용하고 스파이의 메소드를 스텁하려는 경우, 실제 getB() impl은 스터 빙 명령문을 평가하는 동안 호출됩니다. getB()가 널 인수를 처리하지 못하면 NPE가 발생합니다. –

12

당신은 또한 스터 빙 API를 사용할 수 있습니다 method은 다음 패키지에서 메소드를 정적으로 가져옵니다.

  1. org.powermock.api.support.membermodification.MemberMatcher

대한 추가 정보는 documentation을 참조하시기 바랍니다

  • org.powermock.api.support.membermodification.MemberModifier
  • .

    +0

    이 접근법은 나를 위해 일했으나 denis.solonenko의 대답은 그렇지 않았습니다. doReturn, 언제, 주어진, 그리고 스텁을 언제 사용하는지 이해하는 것은 어렵다. 모두 똑같은 일을한다고 주장한다. 때때로 각각의 작품은 다른 작품이 아닌 –

    +0

    Static 클래스로 부분적 조롱을하는 동안이 접근법이 저에게 효과적이었습니다. – srinannapa

    +1

    감사합니다.'stub' 메서드 스코프를 추가하십시오. – Mrusful

    관련 문제