2017-02-09 17 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はデフォルト値(longの場合は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.getTime()を呼び出すときはClassWithStatics.getInt()12345Lです。

+0

動作します。私は本当のgetNextInt()メソッドを呼び出すためにスパイを使うべきです。どうもありがとうございます。 –

+0

素晴らしい!お役に立てて嬉しいです –

関連する問題