web-dev-qa-db-ja.com

整数のリストを返すパワーモックを使用したプライベートメソッドのテスト

整数値のリストを受け取るプライベートメソッドがあり、整数値のリストを返します。パワーモックを使用してテストするにはどうすればよいですか? powermockは初めてですが、簡単なモックでテストを実行できますか?どうやって..

20
user882196

ドキュメント の「Common-Bypass encapsulation」というセクション:

Whitebox.invokeMethod(..)を使用して、インスタンスまたはクラスのプライベートメソッドを呼び出します。

また、同じセクションに例があります。

27
JB Nizet

これを行う方法の完全な例を次に示します。

import Java.util.ArrayList;
import Java.util.List;

import org.junit.Assert;
import org.junit.Test;
import org.powermock.reflect.Whitebox;

class TestClass {
    private List<Integer> methodCall(int num) {
        System.out.println("Call methodCall num: " + num);
        List<Integer> result = new ArrayList<>(num);
        for (int i = 0; i < num; i++) {
            result.add(new Integer(i));
        }
        return result;
    }
}

 @Test
 public void testPrivateMethodCall() throws Exception {
     int n = 10;
     List result = Whitebox.invokeMethod(new TestClass(), "methodCall", n);
     Assert.assertEquals(n, result.size());
 }
7
Whitebox.invokeMethod(myClassToBeTestedInstance, "theMethodToTest", expectedFooValue);
1
Oded Breiner

Powermockitoでプライベートメソッドをテストする場合、このプライベートメソッドの構文は次のとおりです。

private int/void testmeMethod(CustomClass[] params){
....
}

あなたのテストクラスメソッドで:

CustomClass [] params = new CustomClass [] {...} WhiteboxImpl.invokeMethod(spy、 "testmeMethod"、params)

パラメータのために機能しません。その引数を持つtestmeMethodが存在しないというエラーメッセージが表示されます。

WhiteboxImplクラス

public static synchronized <T> T invokeMethod(Object tested, String methodToExecute, Object... arguments)
            throws Exception {
        return (T) doInvokeMethod(tested, null, methodToExecute, arguments);
    }

Array型の引数の場合、PowerMockがめちゃくちゃになります。したがって、これをテストメソッドで次のように変更します。

WhiteboxImpl.invokeMethod(spy,"testmeMethod",(Object) params)

パラメータのないプライベートメソッドの場合、この問題はありません。私が覚えているように、それはタイプPrimitveタイプとラッパークラスのパラメーターに対して機能します。

「TDDの理解はソフトウェアエンジニアリングの理解です」

0
ugurkocak1980