JMockitを使用した単体テスト3

対象メソッド内でインスタンスを生成する場合

テスト対象クラス

public class FortuneTeller {

    public String divine() {
        final Dice dice = new Dice();
        final int value = dice.play();
        switch (value) {
            case 1:
                return "great misfortune";
            case 2:
                return "misfortune";
            case 6:
                return "excellent luck;";
            default:
                return "luck";
        }
    }

    public static final class Dice {
        public int play() {
            return new Random().nextInt(6) + 1;
        }
    }
}

divine()は、さいころの出目によって運勢を返しますが、Dice#play()はランダムな値を返すのでテストできません。このような場合は、次のようにテストクラスを作成します。


テストクラス

    @Test
    public void testDivine() {
        new Expectations() {
            // (1) モックにするオブジェクトを宣言
            Dice mockDice;
            {
                // (2) テスト対象メソッド内で生成されている場合は、インスタンスを生成する。
                mockDice = new Dice();
                // (3) さいころは1を返す
                mockDice.play();
                returns(1);
            }
        };

        final FortuneTeller teller = new FortuneTeller();
        final String result = teller.divine();
        // さいころの出目が"1"の場合は、"great misfortune"(大凶)であることをチェック
        assertEquals("great misfortune", result);
    }


基本は今までと同様ですが、ポイントは(2)でモックをnewするところです。また、Diceはfinalクラスですがモックを生成できることも確認できます。