1. 単体テスト(Unit Test)

問題文

次の Calculator クラスの addsubtract メソッドについて、手動でテストを行う TestCalculator クラスを作成してください。

  • main メソッド内でテストを実装し、期待値と実際の戻り値を比較して、結果をコンソールに "OK""NG" で出力すること。
  • 以下のケースを必ずテストすること:
    1. add(2, 3)5
    2. add(-1, 1)0
    3. subtract(5, 2)3
    4. subtract(0, 4)-4
// テスト対象クラス
public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
    public int subtract(int a, int b) {
        return a - b;
    }
}

模範解答・解説

public class TestCalculator {
    public static void main(String[] args) {
        Calculator calc = new Calculator();
        test("add(2,3)", 5, calc.add(2, 3));
        test("add(-1,1)", 0, calc.add(-1, 1));
        test("subtract(5,2)", 3, calc.subtract(5, 2));
        test("subtract(0,4)", -4, calc.subtract(0, 4));
    }

    private static void test(String label, int expected, int actual) {
        if (expected == actual) {
            System.out.println(label + " => OK");
        } else {
            System.out.println(label + " => NG (expected: " + expected + ", actual: " + actual + ")");
        }
    }
}

  • ポイント
    • test メソッドで「ラベル」「期待値」「実際値」を受け取り、比較結果を出力。
    • 各ケースを独立して実行することで、どのテストが失敗したかすぐ把握できる。

2. 結合テスト(Integration Test)

問題文

単一商品の在庫を管理する Inventory と、それを使って注文処理を行う OrderService に対して、JUnit を使わずに統合テストを行う TestOrderFlow クラスを作成してください。

  • Inventory は内部で int stock を持ち、在庫の有無チェックと在庫減少メソッドを提供する。
  • OrderServiceInventory を受け取り、在庫があれば減少させて true、なければ false を返す。
  • 以下のシナリオを main メソッド内でテストし、結果を "OK""NG" で出力すること:
    1. 初期在庫 10 → 注文後、返り値 true、在庫が 9 になる。
    2. 初期在庫 0 → 注文後、返り値 false、在庫が 0 のまま。
// 在庫管理クラス(単一商品)
public class Inventory {
    private int stock;
    public Inventory(int initialStock) {
        this.stock = initialStock;
    }
    public boolean isAvailable() {
        return stock > 0;
    }
    public void decrement() {
        if (stock > 0) stock--;
    }
    public int getStock() {
        return stock;
    }
}

// 注文処理クラス
public class OrderService {
    private Inventory inventory;
    public OrderService(Inventory inventory) {
        this.inventory = inventory;
    }
    public boolean placeOrder() {
        if (inventory.isAvailable()) {
            inventory.decrement();
            return true;
        } else {
            return false;
        }
    }
}

模範解答・解説

public class TestOrderFlow {
    public static void main(String[] args) {
        // --- テスト1: 在庫あり ---
        Inventory inv1 = new Inventory(10);
        OrderService svc1 = new OrderService(inv1);
        boolean result1 = svc1.placeOrder();
        if (result1 && inv1.getStock() == 9) {
            System.out.println("case1(在庫10→注文): OK");
        } else {
            System.out.println("case1(在庫10→注文): NG (expected: true/9, actual: "
                + result1 + "/" + inv1.getStock() + ")");
        }

        // --- テスト2: 在庫なし ---
        Inventory inv2 = new Inventory(0);
        OrderService svc2 = new OrderService(inv2);
        boolean result2 = svc2.placeOrder();
        if (!result2 && inv2.getStock() == 0) {
            System.out.println("case2(在庫0→注文): OK");
        } else {
            System.out.println("case2(在庫0→注文): NG (expected: false/0, actual: "
                + result2 + "/" + inv2.getStock() + ")");
        }
    }
}

  • ポイント
    • 返り値と在庫数の両方をチェックし、ビジネスロジック全体の結合を確認。

3. システムテスト(System Test)

問題文

標準入力 (Scanner) で2つの整数を受け取って足し算を行い、結果を出力する MainApp を対象に、システムテストの手順を3ケース以上作成してください。

  • テストケースごとに「入力手順」と「期待出力」を明示し、表形式でまとめること。
  • 正常系/異常系を含めて最低3ケースを用意すること。
// MainApp.java
import java.util.Scanner;

public class MainApp {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("1つ目の整数を入力>");
        int a = sc.nextInt();
        System.out.print("2つ目の整数を入力>");
        int b = sc.nextInt();
        System.out.println("Result: " + (a + b));
        sc.close();
    }
}

模範解答・解説

テストケース入力手順例期待出力
正常系11. 起動後「1つ目…>」に 2 ENTER2. 「2つ目…>」に 3 ENTER```
1つ目の整数を入力>2
2つ目の整数を入力>3Result: 5
テストケース入力手順例期待出力
正常系21. 起動後「1つ目…>」に `-1` ENTER<br>2. 「2つ目…>」に `4` ENTER```
1つ目の整数を入力>-1
2つ目の整数を入力>4Result: 3
テストケース入力手順例期待出力
異常系1.起動後「1つ目…>」に `a` ENTER```
1つ目の整数を入力>aException in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:...)
…(省略)

ポイント

  • ユーザー視点でアプリ全体を手動操作し、正常系だけでなく異常系も検証。
  • 実際のプロンプトと出力をそのまま期待値に書くことで、手順どおり動くか確認しやすくする。

JavaSEの問題集トップページに戻る