1. 単体テスト(Unit Test)
問題文
次の Calculator
クラスの add
と subtract
メソッドについて、手動でテストを行う TestCalculator
クラスを作成してください。
main
メソッド内でテストを実装し、期待値と実際の戻り値を比較して、結果をコンソールに"OK"
/"NG"
で出力すること。- 以下のケースを必ずテストすること:
add(2, 3)
→5
add(-1, 1)
→0
subtract(5, 2)
→3
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
を持ち、在庫の有無チェックと在庫減少メソッドを提供する。OrderService
はInventory
を受け取り、在庫があれば減少させてtrue
、なければfalse
を返す。- 以下のシナリオを
main
メソッド内でテストし、結果を"OK"
/"NG"
で出力すること:- 初期在庫 10 → 注文後、返り値
true
、在庫が 9 になる。 - 初期在庫 0 → 注文後、返り値
false
、在庫が 0 のまま。
- 初期在庫 10 → 注文後、返り値
// 在庫管理クラス(単一商品)
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();
}
}
模範解答・解説
テストケース | 入力手順例 | 期待出力 |
---|---|---|
正常系1 | 1. 起動後「1つ目…>」に 2 ENTER2. 「2つ目…>」に 3 ENTER | ``` |
1つ目の整数を入力>2 | ||
2つ目の整数を入力>3 | Result: 5 |
テストケース | 入力手順例 | 期待出力 |
---|---|---|
正常系2 | 1. 起動後「1つ目…>」に `-1` ENTER<br>2. 「2つ目…>」に `4` ENTER | ``` |
1つ目の整数を入力>-1 | ||
2つ目の整数を入力>4 | Result: 3 |
テストケース | 入力手順例 | 期待出力 |
---|---|---|
異常系 | 1.起動後「1つ目…>」に `a` ENTER | ``` |
1つ目の整数を入力>a | Exception in thread "main" java.util.InputMismatchException at java.base/java.util.Scanner.throwFor(Scanner.java:...) …(省略) |
ポイント
- ユーザー視点でアプリ全体を手動操作し、正常系だけでなく異常系も検証。
- 実際のプロンプトと出力をそのまま期待値に書くことで、手順どおり動くか確認しやすくする。