2017-02-09 5 views
1

mockito 코어 버전 : 1.10.19mockStatic이 예상대로 작동하지 않는 이유는 무엇입니까?

powermock 버전 : 1.6.6

는 좀 정적 메서드를 조롱하려고 노력하지만, 출력은 나를 혼란. 다음은 내 코드입니다 :

class ClassWithStatics { 
    public static int getNextInt() { 
     return getInt() + 1; 
    } 

    public static int getInt() { 
     return 1; 
    } 

    public static long getTime() { 
     return System.currentTimeMillis(); 
    } 
} 

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ClassWithStatics.class, System.class}) 
public class StubJustOneStatic { 
    @Test 
    public void test() { 
     PowerMockito.mockStatic(ClassWithStatics.class); 
     Mockito.when(ClassWithStatics.getInt()).thenReturn(0); 

     PowerMockito.mockStatic(System.class); 
     Mockito.when(System.currentTimeMillis()).thenReturn(12345L); 

     System.out.println("Next Int: " + ClassWithStatics.getNextInt()); 
     System.out.println("Int: " + ClassWithStatics.getInt()); 
     System.out.println("Time:" + ClassWithStatics.getTime()); 
    } 
} 

출력은

Next Int: 0 
Int: 0 
Time:0 

하지만 난 다음 코드를 사용하는 경우, ClassWithStatics.getTime() 인쇄는 내가 원하는 정확히.

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ClassWithStatics.class, System.class}) 
public class StubJustOneStatic { 
    @Test 
    public void test() { 
     // PowerMockito.mockStatic(ClassWithStatics.class); 
     // Mockito.when(ClassWithStatics.getInt()).thenReturn(0); 

     PowerMockito.mockStatic(System.class); 
     Mockito.when(System.currentTimeMillis()).thenReturn(12345L); 

     // System.out.println("Next Int: " + ClassWithStatics.getNextInt()); 
     // System.out.println("Int: " + ClassWithStatics.getInt()); 
     System.out.println("Time:" + ClassWithStatics.getTime()); 
    } 
} 

고마워요.

+0

그리고 평범한 호언 장담 : 정적 방법을 사용하면 코드를 테스트하기가 어렵습니다. PowerMock으로 바꾸는 것은 잘못된 대답입니다. 시험용 코드를 대신 작성하십시오 ;-) – GhostCat

답변

1

정적 클래스를 조롱하고 있습니다. 즉, when() .. then() 비헤이비어를 명시 적으로 정의하지 않으면 Mockito는 기본값 (0의 경우 0)을 반환합니다.

당신은 실행 다른 방법을 특정 방법을 조롱하고 수 있도록하기 위해 감시를 사용하는 것 구현 :

PowerMockito.spy(ClassWithStatics.class); 
Mockito.when(ClassWithStatics.getInt()).thenReturn(5); 

을 이제 당신이 호출 할 때 호출 할 때

PowerMockito.mockStatic(System.class); 
Mockito.when(System.currentTimeMillis()).thenReturn(12345L); 

System.out.println("Time:" + ClassWithStatics.getTime()); 

당신은 5을 얻어야한다 ClassWithStatics.getInt()12345L을 호출 할 때 ClassWithStatics.getTime()을 호출합니다.

+0

작동합니다. 나는 진짜 getNextInt() 메소드를 호출하기 위해 스파이를 사용해야한다. 정말 고맙습니다. –

+0

좋습니다! 다행히 도울 수있어. –