本ページはプロモーションが含まれています

IT全般

単体テストの考え方/使い方の書評|モックに迷っていたJavaの現場で読んだ

CATEGORY
REV.
DRAWN BY
TOM
SHEETS
9枚
単体テストの考え方/使い方(モックに迷っていたときに読んだ)

トム

SESで約8年、環境を変えられないもどかしさの中にいました。32歳で自社開発企業に転職し、今はClaude Codeと自動化で、仕事も時間も組み直している途中です。
・Javaバックエンドエンジニア(Java歴12年以上)
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎
詳細なプロフィール

𝕏

現職のJava開発で、単体テストをどう書けばいいのか迷っていた時期があります。特に悩んでいたのが、モックの使い方でした。そのときに読んだのが、『単体テストの考え方/使い方』です。

結論から言うと、コードの刷新や新しいコードづくりで、これから単体テストをがっつり書く人に合う1冊です。JUnitの書き方ではなく、「何のためのテストか」「どこまでモックにするか」という考え方の本です。

どこが役に立って、読んでから何を変えたのかを書きます。

単体テストの考え方/使い方はどんな本か

書名単体テストの考え方/使い方
著者Vladimir Khorikov(訳:須田智之)
出版社マイナビ出版
発売日2022年12月28日
ページ数・定価416ページ(B5変)/4,488円(税込)
電子版あり
コード例の言語C#

書誌情報はマイナビ出版の書籍ページによるものです。中身は4つの部に分かれています。

本の構成:「なぜ書くか」から始まり、やってはいけない書き方で終わる
1
PART 1 / 第1〜3章第1部 単体テストとは
2
PART 2 / 第4〜7章第2部 単体テストとその価値
3
PART 3 / 第8〜10章第3部 統合テスト
4
PART 4 / 第11章第4部 単体テストのアンチ・パターン
NOTE部と章の見出しはマイナビ出版の書籍ページの目次による

前半で単体テストの定義と価値を固め、後半でモック・データベース・アンチパターンといった実務の悩みどころに進む作りです。

読んだきっかけ|Javaの現場で、モックの使い方に迷っていた

LOG現職のJava開発テストをどう書くか、モックをどう使うか

仕事のJava開発で単体テストを書くたびに、どう書くのが正解なのか迷っていました。いちばん悩んでいたのは、どこをモックにして、何を確かめればいいのかです。

役に立ったところ|定義・目的・モックの種類

いちばん役に立ったのは、次の3つです。目次で言うと、このあたりです。

  • 単体テストの定義:第2章「単体テストとは何か?」の「2.1 単体テストの定義」
  • コードを壊さないために作る、という目的:第1章「なぜ、単体(unit)テストを行うのか?」、第4章「良い単体テストを構成する4本の柱」
  • モックの種類:第5章「モックの利用とテストの壊れやすさ」の「5.1 モックとスタブの違い」、第9章「モックのベスト・プラクティス」

「なんとなくテストを書く」のではなく、あとでコードを変えたときに壊れていないことを確かめるために書く。この目的がはっきりすると、どんなテストを書くべきかを判断しやすくなります。

モックについては、種類ごとに役割が違うと分かったのが役に立ちました。いちばん基本になるのが、スタブとモックの違いです。

スタブとモック:同じ「偽物」でも、向きがちがう
IN / 入ってくるスタブテスト対象に入ってくるデータを用意する偽物例:DBから読んだことにして値を返す
OUT / 出ていくモックテスト対象から出ていく呼び出しを確かめる偽物例:メールを送ったかを確かめる
NOTE言葉は第5章「5.1 モックとスタブの違い」の見出しによる。説明は筆者の言い換え

第2章では、モックをどこまで使うかで単体テストの考え方が「古典学派」と「ロンドン学派」に分かれる話も出てきます。この2つの違いはロンドン学派と古典学派の違いにまとめています。

読んでから変えたこと|実装に依存させない・意味のないテストは書かない

読んでから、職場で単体テストを書くときに2つのことを守るようにしました。職場のコードは載せられないので、ここでは考え方が同じになるように書いた短い例で説明します。

読んでから決めた2つのルール(テストを書こうとしたら、Q1から順に答える)
QUESTION / 質問
OK のとき
NG のとき
Q1. このテストは、何を壊さないために書く?
答えられる → Q2へ
NG 答えられない → 書かない
Q2. 中の作りを変えたら、結果が同じでも落ちる?
落ちない → このまま書く
NG はい、落ちる → 結果を確かめる形に直す

単体テストを実装に依存させない

たとえば、テスト対象の中で呼んでいるメソッドまでモックにして、「呼ばれたかどうか」を確かめるテストがあります。こういうテストは、中の作りを少し変えただけで、結果が正しくても落ちます。

// 実装に依存したテスト:中で呼んでいるメソッドを確かめている
@Test
void 会員は1割引きになる() {
    DiscountPolicy policy = mock(DiscountPolicy.class);
    when(policy.rateFor(MEMBER)).thenReturn(10);
    PriceCalculator calculator = new PriceCalculator(policy);

    calculator.priceOf(1000, MEMBER);

    // 「rateForを1回呼んだか」を確かめている。
    // 計算のしかたを変えると、結果が正しくても落ちる
    verify(policy, times(1)).rateFor(MEMBER);
}

実装に依存させないなら、外から見える結果だけを確かめます。

// 実装に依存しないテスト:外から見える結果だけを確かめる
@Test
void 会員は1割引きになる() {
    PriceCalculator calculator = new PriceCalculator(new DiscountPolicy());

    int price = calculator.priceOf(1000, MEMBER);

    // 中の作りを変えても、900円になる限り落ちない
    assertEquals(900, price);
}

モックを使うのは、メール送信や外部APIのように、テスト対象の外へ出ていくやりとりを確かめたいときに絞ります。本の言葉で言うと、第5章の「観察可能な振る舞い」と「実装の詳細」の区別です。Mockitoの書き方そのものはMockitoの使い方にまとめています。

意味のないテストは書かない

もう1つは、守っているものがないテストを書かないことです。たとえば、値を入れて取り出すだけのgetterのテストは、コードを変えても壊れようがないので、書いても安心は増えません。

// 書かないテストの例:守っているものがない
@Test
void 名前を取得できる() {
    Member member = new Member("トム");
    assertEquals("トム", member.getName());
}

大事なのはテストの数ではなく、壊れたら困る振る舞いにテストがあるかです。

合わなかったところ|特になし

合わなかったところは、特にありませんでした。注意点を挙げるなら、コード例がC#で書かれていることと、416ページと厚いことです。

ハマりポイント
コード例はC#。Javaに置き換えながら読む

テストの書き方の細かい文法はC#のものです。Javaで書くなら、JUnit5とMockitoで同じことをどう書くかをJUnit5の使い方入門で確かめながら読むと迷いません。考え方は言語に関係なく使えます。

今のレベル別の読み方

416ページを前から全部読む必要はありません。今の自分に合わせて、読む章を絞ると早いです。

今の自分読む章ねらい
単体テストをほとんど書いたことがない第1部(第1〜3章)→ 第4章何のために書くのか、良いテストとは何かを先に固める
書いているが、モックの使い方に迷う第2章 → 第5章 → 第9章スタブとモックの違いと、どこをモックにするかの線引きを知る
DBや外部とつながる部分のテストまで整えたい第8章・第10章 → 第11章統合テストの範囲と、やってはいけない書き方を確かめる

向いている人・向いていない人

  • 向いている人:コードの刷新や新しいコードづくりで、単体テストを書く人。これから単体テストをがっつり書いていく人。モックの使い方に迷っている人
  • 向いていない人:JUnitやMockitoの書き方(文法)だけを知りたい人。この本はC#の例で考え方を説明する本なので、書き方は別の記事や公式ドキュメントのほうが早いです

JUnitの記事とあわせて読むなら

この本で考え方を固めたら、Javaでの書き方は次の記事で確かめられます。

読んだ本はほかにも、トムの本棚に並べています。

よくある質問

Q. コード例がC#ですが、Javaの人でも役に立ちますか?

役に立ちます。私もJavaの開発で迷っていて読みました。書かれているのはテストの考え方なので、JUnit5とMockitoに置き換えればそのまま使えます。

Q. 2022年の本ですが、内容は古くなっていませんか?

特定のフレームワークの使い方ではなく、単体テストの目的やモックの使いどころといった考え方の本なので、古くなりにくい内容です。ライブラリの細かい書き方は、公式ドキュメントで確かめてください。

Q. 電子版はありますか?

あります。マイナビ出版の書籍ページでは、紙の本と電子版が同じ価格で出ています。

REVISIONS / 改訂履歴
REV.DATE内容
42026-10-16図解を描き直し(図面のデザインにそろえた)
32026-10-06記載内容の事実確認と修正
22026-09-032026年9月時点の情報で全体を見直し
12026-03-13初版
NEXT STEP
次に書く単体テストで、「中の作りを変えたら落ちないか」を1つ確かめてみてください。

verifyで中の呼び出しを確かめているテストがあれば、結果を確かめる形に直せないか考えてみる。それだけでも、リファクタリングで落ちるテストが減ります。

NEXT READ本棚から1本

AIで開発を組み直すなら、まずこの5冊から

入門・実践・設計まで、Claude Codeの本をレベル別に5冊選んで比べました。

→ おすすめ5冊を見る

  • この記事を書いた人
  • 最新記事

トム

SESで約8年、環境を変えられないもどかしさの中にいました。32歳で自社開発企業に転職し、今はClaude Codeと自動化で、仕事も時間も組み直している途中です。
・Javaバックエンドエンジニア(Java歴12年以上)
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎
詳細なプロフィール

𝕏

IT全般 ・