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クラスですがモックを生成できることも確認できます。