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
模擬してみてください。
だから、最終的に私の質問は:
任意の解決策はありますか、少なくとも実行可能な回避策は、以上に述べた問題を修正しますか?
サイドノートと同様:*ホワイトボックス*は「内部」クラスです。最近のバージョンのMockitoに更新するときに気付くでしょう(そのクラスはそこにあるので)。しかし、悲しいかな、あなたは最近のより楽しいバージョンのMockitoにアップデートするつもりはありません。なぜなら、PowerMockは最新バージョンのMockitoで動作しないからです。トピックから完全に外れています:しかし、あなたはそのような問題から自分を救いたいときは:PowerMockを取り除こうとしてください。サードパーティのコードをテストするためにそれを使用している場合を除き、**使用する理由はありません**。 *あなたが壊れたデザインを修理するときに、PowerMockが必要とするすべてのものをテストすることができます.-) – GhostCat
「模擬」の代わりに「スパイ」を使用しようとしましたか? –
もう1つの質問:どのバージョンのPowerMockを使用しますか?モキト? –