2017-02-15 2 views
3

今日、私は多くのwhenNewモッキングを含む非常に巨大なテストケースをデバッグしていました。@ PrepareForTest、@RunWithとラムダ式

最終的にはと@RunWithの注釈をPowerMockと使用すると、テスト中のクラスの中でラムダ式が実行されていないように見えます。呼び出されないと、テストは失敗します決してfillArrayメソッド内で、前述の例のラムダ式で

@PrepareForTest(Solution.class) 
@RunWith(PowerMockRunner.class) 
public class SolutionTest { 
    @Test 
    public void test() { 
     int[] arr = new int[5]; 
     Solution solutionMock = mock(Solution.class); 
     Whitebox.setInternalState(solutionMock, "arr", arr); 
     doCallRealMethod().when(solutionMock).fillArray(); 

     solutionMock.fillArray(); 

     for (int i = 0; i < 5; i++) { 
      assertEquals(i, arr[i]); 
     } 
} 

public class Solution { 
    private int[] arr; 

    void fillArray() { 
     IntStream.range(0, arr.length).forEach(i -> arr[i] = i); 
    } 
} 

とテストクラス:ここ

は、問題を示すサンプルです。 SolutionTestのアノテーション(またはその両方)のいずれかを削除するとテストに合格しますが、実際には解決策がありません。whenNew模擬してみてください。

だから、最終的に私の質問は:

任意の解決策はありますか、少なくとも実行可能な回避策は、以上に述べた問題を修正しますか?

+0

サイドノートと同様:*ホワイトボックス*は「内部」クラスです。最近のバージョンのMockitoに更新するときに気付くでしょう(そのクラスはそこにあるので)。しかし、悲しいかな、あなたは最近のより楽しいバージョンのMockitoにアップデートするつもりはありません。なぜなら、PowerMockは最新バージョンのMockitoで動作しないからです。トピックから完全に外れています:しかし、あなたはそのような問題から自分を救いたいときは:PowerMockを取り除こうとしてください。サードパーティのコードをテストするためにそれを使用している場合を除き、**使用する理由はありません**。 *あなたが壊れたデザインを修理するときに、PowerMockが必要とするすべてのものをテストすることができます.-) – GhostCat

+0

「模擬」の代わりに「スパイ」を使用しようとしましたか? –

+1

もう1つの質問:どのバージョンのPowerMockを使用しますか?モキト? –

答えて

0

このテストは、PowerMock 1.6.6とMockito 1.10.19と合格します。バージョンがアップグレードされていることを確認してください。