2016-09-20 13 views
1

私はPowerMockitoを使用して静的メソッドをモックし、より良いラインカバレッジを取得しています。テストは合格しますが、Coberturaは依然としてリターンラインを赤で示しています。 PowerMockitoを間違った方法で使用しているかどうかはわかりません。すべての手がかりは?静的メソッドを模擬するためにPowerMockitoを使用したモック静的メソッド

MUT

public static Object getBean(String beanName) { 
    return AppContext.getApplicationContext().getBean(beanName); 
} 

JUnitテスト

@RunWith (PowerMockRunner.class) 
@PrepareForTest ({AppContext.class}) 

private ApplicationContext applicationContext; 

@Test 
public void testGetBean() throws Exception { 
    String beanName = "junitBean"; 
    applicationContext = Mockito.mock(ApplicationContext.class); 

    PowerMockito.mockStatic(AppContext.class); 

    AppContext.setApplicationContext(applicationContext); 
    PowerMockito.when(AppContext.getApplicationContext()).thenReturn(applicationContext); 
    PowerMockito.when(AppContext.getApplicationContext().getBean(beanName)).thenReturn(Object.class); 

    AppContext.getBean(beanName); 
} 
+0

テストクラスに注釈を付けて、powermockランナーを使用しましたか? – azurefrog

+0

私はちょうど私の質問を更新しました。はい、私は注釈を持っています。 – Jaykumar

答えて

1

、PowerMockは、それがコンパイルされた後、あなたのクラスでのJavaのバイトコードを変更する必要があります。コードカバレッジツールは同じ方法で動作します。コードのどの行が実行されたかに関する情報を収集するためにバイトコードを "計測"( "バイトコード計測"の場合はgoogle)します。

ここでは、自分の必要に応じて既にコンパイルされたコードを変更する2つのことがあるので、それらがうまく機能しないことは驚くことではありません。実際、他のカバレッジツールは同じ問題を抱えています。 PowerMock GitHubページのthis issue

このように、静的メソッドをモックすることは悪い考えであり、非常に例外的な状況でのみ行われるべきです。ほとんどの場合、静的メソッド呼び出しをインターフェイスでラップし、インターフェイスのインスタンスをテスト対象のオブジェクトに渡すか、コードがコントロールの下にある場合は静的メソッドを削除してインスタンスに置き換えることができます方法。

ApplicationContextインスタンスをテスト対象のクラスのコンストラクタに直接渡すこともできます。

関連する問題