SlideShare a Scribd company logo
Chapter 11.
Using Test Doubles
前回のまとめ
前回のまとめ
                                           設定可能?

Dummy   コンパイラを満足させるためだけに存在                   ×



Stub    テストから設定された値を SUT に返すために使う。           ○



Spy     SUT から値を受けとるために使う。SUT とのやりとりを覚え      ○
        ていて、テストは後で spy から聞き出す。


Mock    間接的入力/出力に使え、SUT とのやりとりを厳格にも寛容に       ○
        もすることができる。予想外のやりとりならすぐ失敗させるこ
        ともできる
Fake    テスト用に単純化された、 DOC の別実装。実際には DB に接     ×
        続に行かず、特定の値を返す Dao とか。
Providing the Test Double
●
    2 approaches
    ●
        Hand-Built Test Double
        –   Hard-Coded Test Double
        –   ちょっとがんばれば configurable になる
    ●
        Dynamically Generated Test Double
        –   基本的に Configurable Test Double
        –   jMock ファミリーが代表的 (←ちょっと情報が古い)
        –   EasyMock は少し毛色が違う
public void testDisplayCurrentTime_AtMidnight_PS() throws Exception {
  //Define and instantiate Test Stub
  TimeProvider testStub = new PseudoTimeProvider() { //Anonymous inner stub
    public Calendar getTime(String timeZone) {
      Calendar myTime = new GregorianCalendar();
      myTime.set(Calendar.MINUTE, 0);
      myTime.set(Calendar.HOUR_OF_DAY, 0);
      return myTime;
    }                
  };
  //Instantiate SUT
  TimeDisplay sut = new TimeDisplay();
  //Inject Test Stub into SUT
  sut.setTimeProvider(testStub);
  //Exercise SUT
  String result = sut.getCurrentTimeAsHtmlFragment();
  //Verify direct output
  String expectedTimeString = "<span class="tinyBoldText">Midnight</span>";
  assertEquals("Midnight", expectedTimeString, result);
}
Pseudo-Objects
●
    静的型付け言語で Hand-Coded な Double を
    作成するときには、 Pseudo-Object を作成し
    ておくと楽になる
    ●
        Inner Test Doubles や Self-Shunt につかう
Pseudo-Objects
/**
 * Base class for hand-coded Test Stubs and Mock Objects
 */
public class PseudoTimeProvider implements ComplexTimeProvider {

                       
    public Calendar getTime() throws TimeProviderEx {
      throw new PseudoClassException();
    }

    public Calendar getTimeDifference(Calendar baseTime,
                                      Calendar otherTime)
         throws TimeProviderEx {
      throw new PseudoClassException();
    }

    public Calendar getTime(String timeZone ) throws TimeProviderEx {
      throw new PseudoClassException();
    }
}
Configuring the Test Double
●
    Test Stub, Mock Object は何を返すか、何を話し
    かけられるかの設定行為が必要
    ●
        Hard-Coded Test Double の場合は設計時(コーディン
        グ時)に設定を行う
    ●
        Configurable Test Double はランタイムにテストから
        設定される
        –   Stub, Spy は何を返すかの設定が必要
        –   Mock は何を話しかけられるかの設定も加えて必要
●
    どういう値を選ぶかは設計行為そのもの
    ●
        テストの理解容易性
    ●
        Double の再利用性
Configuring the Test Double(2)
●
    Fake は SUT から使われるだけなのでランタイ
    ムに設定される必要なし
●
    Dummy は実行されないので設定の必要なし
●
    Procedual Test Stub は Hard-Coded の代表
    例
●
Configuring the Test Double(3)
●
    Configurable Test Double の設定方法
    ●
        Configuration Interface
    ●
        Configuration Mode
●
    利点
    ●
        テスト間での再利用性が高い
    ●
        値がテストコード内に書かれるので理解しやすい
        –   Mystery Guest アンチパターンを防ぐ
●
    設定場所は fixture setup と同じ扱い
Installing the Test Double
●
    “install” という言葉
●
    基本的な流れ
    ●
        Test Double のインスタンス化
    ●
        Configurable Test Double な場合は設定する
    ●
        「 Test Double を使え」とSUT の実行前か実行時
        に伝える
●
    “install” 方法は何種類かある
    ●
        種類の選択はテスト容易性の設計といえる
    ●
        選択の余地が無い場合も多いが、再設計もあるよ!
Installing the Test Double(2)
●
    基本的な選択肢は三つ
    ●
        Dependency Injection
    ●
        Dependency Lookup
    ●
        Test Hook
●
    IoC フレームワークが提供されている言語の場
    合にはいろいろ仕組みを自分で作らずに済む
Dependency Injection
●
    SUT が依存を自ら探すのではなく、誰かがラン
    タイムに外から設定する
●
    偽者を渡しやすいので TDD との相性◎
●
    依存性解決に関する知識が SUT から無くなる
    ので SUT の再利用性も大幅 UP
●
    3 types
    ●
        Setter Injection
    ●
        Constructor Injection
    ●
        Parameter Injection
Dependency Lookup
●
    テスト容易性を設計に組み込んでいなかった
    り、Dependency Injection の仕組みが言語に
    無い場合に使う
●
    SUT が誰かに DOC の作成を依頼する
    ●
        DOC の生成知識自体は SUT は持たない
    ●
        「誰か」は有名人になってしまう
●
    2 types (あまり違いは無い)
    ●
        Object Factory (GoF)
    ●
        Service Locator (PofEAA)
Test Specific Subclass
Test-Specific Subclass
●
    DI も DL も無くても、まだ諦めてはいけない
●
    介入可能な仕組みを組み上げてもがこう
    ●
        Singleton 死すべし
●
    DI 可能な仕組みを備えた、SUT のサブクラスを
    作成する
    ●
        テストに必要な部分に関して、 SUT のオーバーライ
        ドを行う
    ●
        でも SUT が non-private な self-call をする必要が
        ある
Test-Specific Subclass(2)
●
    DOC のサブクラスを作成する手もある
    ●
        Subclassed Test Double になる
    ●
        SUT のサブクラス作成よりは相対的に安全
Other Ways (最後の手段)
●
    Test Hooks
    ●
        Test Logic in Production
    ●
        レガシーコードからの第一手として
●
    さらなる手段は WEwLC にたくさんあるよ!
    ●
        Object Seam とか
    ●
        Dependency Breaking Technique の宝庫
        –   でも使わない状況になるのが一番幸せ
●
    AOP もある
ご清聴
ありがとう
ございました

More Related Content

What's hot (18)

PDF
テストコードの定型化
Shinichi Hirauchi
 
KEY
GroovyなAndroidテスト #atest_hack
Takahiro Yoshimura
 
PDF
xUnit Test Patterns - Chapter19
Takuto Wada
 
PPT
ユニットテスト_2日目
Yoshiki Shibukawa
 
PDF
xUnit Test Patterns - Chapter16
Takuto Wada
 
PPTX
わんくま名古屋 #32 (20140823) TDD道場 #20
Yasuhiko Yamamoto
 
PDF
PHPUnit でテスト駆動開発を始めよう
Yuya Takeyama
 
PDF
Java SE 9の紹介: モジュール・システムを中心に
Taku Miyakawa
 
PDF
Unity testtool
大介 束田
 
PDF
Akka Unit Testing
Masashi (Jangsa) Kawaguchi
 
PDF
Javaのログ出力: 道具と考え方
Taku Miyakawa
 
PDF
最近の単体テスト
Ken Morishita
 
PPT
PHP agile test tips
Tsutomu Chikuba
 
PPTX
ソフトウェア・テスト入門8
Kenta Hattori
 
PPTX
Sharing Deep Dive
Takaaki Suzuki
 
PPTX
C# 8.0 Preview in Visual Studio 2019 (16.0)
信之 岩永
 
PDF
Nds#24 単体テスト
Kazumune Katagiri
 
PDF
Ruby初級者向けレッスン 第46回 ─── Test::Unit
higaki
 
テストコードの定型化
Shinichi Hirauchi
 
GroovyなAndroidテスト #atest_hack
Takahiro Yoshimura
 
xUnit Test Patterns - Chapter19
Takuto Wada
 
ユニットテスト_2日目
Yoshiki Shibukawa
 
xUnit Test Patterns - Chapter16
Takuto Wada
 
わんくま名古屋 #32 (20140823) TDD道場 #20
Yasuhiko Yamamoto
 
PHPUnit でテスト駆動開発を始めよう
Yuya Takeyama
 
Java SE 9の紹介: モジュール・システムを中心に
Taku Miyakawa
 
Unity testtool
大介 束田
 
Akka Unit Testing
Masashi (Jangsa) Kawaguchi
 
Javaのログ出力: 道具と考え方
Taku Miyakawa
 
最近の単体テスト
Ken Morishita
 
PHP agile test tips
Tsutomu Chikuba
 
ソフトウェア・テスト入門8
Kenta Hattori
 
Sharing Deep Dive
Takaaki Suzuki
 
C# 8.0 Preview in Visual Studio 2019 (16.0)
信之 岩永
 
Nds#24 単体テスト
Kazumune Katagiri
 
Ruby初級者向けレッスン 第46回 ─── Test::Unit
higaki
 

Viewers also liked (20)

PDF
組織にテストを書く文化を根付かせる戦略と戦術
Takuto Wada
 
PPTX
Mutation Testing
10Pines
 
PDF
Europe 2003
Fe Angela Verzosa
 
PDF
SapporoRubyKaigi02 t-wada LT
Takuto Wada
 
PPTX
WWDC 2016の概観
Yuta Hoshino
 
PPTX
Random testing
Can KAYA
 
PDF
Mutation Testing
ESUG
 
PDF
TDDBC お題
Takuto Wada
 
PPTX
フィーチャモデルの描き方
H Iseri
 
PDF
型についてあれこれ
Yuta Shimakawa
 
PDF
テストファースト、自動テストを導入するという事について(@社内勉強会)
kyon mm
 
PDF
power-assert in JavaScript
Takuto Wada
 
PDF
Reviewing RESTful Web Apps
Takuto Wada
 
PDF
私にとってのテスト
Takuto Wada
 
PDF
ペアプログラミング ホントのところ
Takuto Wada
 
PDF
TDD のこころ @ OSH2014
Takuto Wada
 
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
 
PDF
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Tomohiro Kumagai
 
PDF
RESTful Web アプリの設計レビューの話
Takuto Wada
 
PDF
Patterns in Test Automation
Anand Bagmar
 
組織にテストを書く文化を根付かせる戦略と戦術
Takuto Wada
 
Mutation Testing
10Pines
 
Europe 2003
Fe Angela Verzosa
 
SapporoRubyKaigi02 t-wada LT
Takuto Wada
 
WWDC 2016の概観
Yuta Hoshino
 
Random testing
Can KAYA
 
Mutation Testing
ESUG
 
TDDBC お題
Takuto Wada
 
フィーチャモデルの描き方
H Iseri
 
型についてあれこれ
Yuta Shimakawa
 
テストファースト、自動テストを導入するという事について(@社内勉強会)
kyon mm
 
power-assert in JavaScript
Takuto Wada
 
Reviewing RESTful Web Apps
Takuto Wada
 
私にとってのテスト
Takuto Wada
 
ペアプログラミング ホントのところ
Takuto Wada
 
TDD のこころ @ OSH2014
Takuto Wada
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
 
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Tomohiro Kumagai
 
RESTful Web アプリの設計レビューの話
Takuto Wada
 
Patterns in Test Automation
Anand Bagmar
 
Ad

Similar to xUnit Test Patterns - Chapter11 (20)

PDF
C# から java へのプログラム移植で体験したtddの効果は?
Shinichi Hirauchi
 
PPTX
Junit4
ichikaz3
 
PDF
『JUnit実践入門』写経・実践会 in 横浜 #3
shinyaa31
 
KEY
Unit testで定時帰宅!
Funato Takashi
 
PDF
TDDワークショップ(第2回)
Yoshihiro Furukawa
 
PDF
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
Tomoharu ASAMI
 
PDF
JS開発におけるTDDと自動テストツール利用の勘所
Koji Nakamura
 
KEY
Clojrue 13 testing
Kiyotaka Kunihira
 
KEY
テスト初心者Androiderのためのソフトウェアテスト入門
Satoshi Watanabe
 
PDF
TDDを一年やってみました ~シロート集団がTDDをやってはまったこと~
Tomomi Kajita
 
PDF
Gui自動テストツール基本
Tsuyoshi Yumoto
 
PDF
Introduction to Spock
Takahiro Sugiura
 
PDF
『JUnit実践入門』写経・実践会 in 横浜 #2
shinyaa31
 
PPTX
JaSST2017_大規模業務システムにおける再利用可能なテスト自動化の取り組み
Hideki Sugimoto
 
PDF
ソフトウェア工学2023 11 テスト
Toru Tamaki
 
PDF
エクストリームエンジニア4
T-arts
 
PDF
java-ja TDD 2nd
Takuto Wada
 
PPTX
C++でテスト駆動開発
Akineko Shimizu
 
PDF
はじめてのテスト技法
Tatsuya Saito
 
KEY
テストコードのリファクタリング
Shuji Watanabe
 
C# から java へのプログラム移植で体験したtddの効果は?
Shinichi Hirauchi
 
Junit4
ichikaz3
 
『JUnit実践入門』写経・実践会 in 横浜 #3
shinyaa31
 
Unit testで定時帰宅!
Funato Takashi
 
TDDワークショップ(第2回)
Yoshihiro Furukawa
 
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
Tomoharu ASAMI
 
JS開発におけるTDDと自動テストツール利用の勘所
Koji Nakamura
 
Clojrue 13 testing
Kiyotaka Kunihira
 
テスト初心者Androiderのためのソフトウェアテスト入門
Satoshi Watanabe
 
TDDを一年やってみました ~シロート集団がTDDをやってはまったこと~
Tomomi Kajita
 
Gui自動テストツール基本
Tsuyoshi Yumoto
 
Introduction to Spock
Takahiro Sugiura
 
『JUnit実践入門』写経・実践会 in 横浜 #2
shinyaa31
 
JaSST2017_大規模業務システムにおける再利用可能なテスト自動化の取り組み
Hideki Sugimoto
 
ソフトウェア工学2023 11 テスト
Toru Tamaki
 
エクストリームエンジニア4
T-arts
 
java-ja TDD 2nd
Takuto Wada
 
C++でテスト駆動開発
Akineko Shimizu
 
はじめてのテスト技法
Tatsuya Saito
 
テストコードのリファクタリング
Shuji Watanabe
 
Ad

More from Takuto Wada (19)

PDF
OSS活動の活発さと評価の関係について
Takuto Wada
 
PDF
unassert - encourage reliable programming by writing assertions in production
Takuto Wada
 
PDF
OSS についてあれこれ
Takuto Wada
 
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
PDF
power-assert, mechanism and philosophy
Takuto Wada
 
PDF
アジャイルサムライの次に読む技術書
Takuto Wada
 
PDF
Test Yourself - テストを書くと何がどう変わるか
Takuto Wada
 
PDF
テスト用ライブラリ power-assert
Takuto Wada
 
PDF
テストを書く文化を育てる戦略と戦術
Takuto Wada
 
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
Takuto Wada
 
PDF
愛せないコードを書くには人生はあまりにも短い
Takuto Wada
 
PDF
例外設計における大罪
Takuto Wada
 
PDF
DevLOVE DDDBC
Takuto Wada
 
PDF
TDDBC Fukuoka Day1
Takuto Wada
 
PDF
js テスト放浪記
Takuto Wada
 
PDF
xUTP Chapter27 Generated Value
Takuto Wada
 
PDF
The only one big thing every programmer should know
Takuto Wada
 
PDF
10+1 Things you should know about JavaScript testing
Takuto Wada
 
PDF
TDD のこころ
Takuto Wada
 
OSS活動の活発さと評価の関係について
Takuto Wada
 
unassert - encourage reliable programming by writing assertions in production
Takuto Wada
 
OSS についてあれこれ
Takuto Wada
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
power-assert, mechanism and philosophy
Takuto Wada
 
アジャイルサムライの次に読む技術書
Takuto Wada
 
Test Yourself - テストを書くと何がどう変わるか
Takuto Wada
 
テスト用ライブラリ power-assert
Takuto Wada
 
テストを書く文化を育てる戦略と戦術
Takuto Wada
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
Takuto Wada
 
愛せないコードを書くには人生はあまりにも短い
Takuto Wada
 
例外設計における大罪
Takuto Wada
 
DevLOVE DDDBC
Takuto Wada
 
TDDBC Fukuoka Day1
Takuto Wada
 
js テスト放浪記
Takuto Wada
 
xUTP Chapter27 Generated Value
Takuto Wada
 
The only one big thing every programmer should know
Takuto Wada
 
10+1 Things you should know about JavaScript testing
Takuto Wada
 
TDD のこころ
Takuto Wada
 

Recently uploaded (10)

PDF
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
PDF
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
PDF
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
PDF
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
PDF
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
PDF
ABC2025S LT講演「世界の窓から Androidこんにちは2025」アプリ自動生成の将来?ロボティクスの夢再び?
嶋 是一 (Yoshikazu SHIMA)
 
PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
PDF
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
PDF
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
PDF
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
ABC2025S LT講演「世界の窓から Androidこんにちは2025」アプリ自動生成の将来?ロボティクスの夢再び?
嶋 是一 (Yoshikazu SHIMA)
 
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 

xUnit Test Patterns - Chapter11

  • 3. 前回のまとめ 設定可能? Dummy コンパイラを満足させるためだけに存在 × Stub テストから設定された値を SUT に返すために使う。 ○ Spy SUT から値を受けとるために使う。SUT とのやりとりを覚え ○ ていて、テストは後で spy から聞き出す。 Mock 間接的入力/出力に使え、SUT とのやりとりを厳格にも寛容に ○ もすることができる。予想外のやりとりならすぐ失敗させるこ ともできる Fake テスト用に単純化された、 DOC の別実装。実際には DB に接 × 続に行かず、特定の値を返す Dao とか。
  • 4. Providing the Test Double ● 2 approaches ● Hand-Built Test Double – Hard-Coded Test Double – ちょっとがんばれば configurable になる ● Dynamically Generated Test Double – 基本的に Configurable Test Double – jMock ファミリーが代表的 (←ちょっと情報が古い) – EasyMock は少し毛色が違う
  • 5. public void testDisplayCurrentTime_AtMidnight_PS() throws Exception { //Define and instantiate Test Stub TimeProvider testStub = new PseudoTimeProvider() { //Anonymous inner stub public Calendar getTime(String timeZone) { Calendar myTime = new GregorianCalendar(); myTime.set(Calendar.MINUTE, 0); myTime.set(Calendar.HOUR_OF_DAY, 0); return myTime; }     }; //Instantiate SUT TimeDisplay sut = new TimeDisplay(); //Inject Test Stub into SUT sut.setTimeProvider(testStub); //Exercise SUT String result = sut.getCurrentTimeAsHtmlFragment(); //Verify direct output String expectedTimeString = "<span class="tinyBoldText">Midnight</span>"; assertEquals("Midnight", expectedTimeString, result); }
  • 6. Pseudo-Objects ● 静的型付け言語で Hand-Coded な Double を 作成するときには、 Pseudo-Object を作成し ておくと楽になる ● Inner Test Doubles や Self-Shunt につかう
  • 7. Pseudo-Objects /** * Base class for hand-coded Test Stubs and Mock Objects */ public class PseudoTimeProvider implements ComplexTimeProvider {     public Calendar getTime() throws TimeProviderEx { throw new PseudoClassException(); } public Calendar getTimeDifference(Calendar baseTime, Calendar otherTime) throws TimeProviderEx { throw new PseudoClassException(); } public Calendar getTime(String timeZone ) throws TimeProviderEx { throw new PseudoClassException(); } }
  • 8. Configuring the Test Double ● Test Stub, Mock Object は何を返すか、何を話し かけられるかの設定行為が必要 ● Hard-Coded Test Double の場合は設計時(コーディン グ時)に設定を行う ● Configurable Test Double はランタイムにテストから 設定される – Stub, Spy は何を返すかの設定が必要 – Mock は何を話しかけられるかの設定も加えて必要 ● どういう値を選ぶかは設計行為そのもの ● テストの理解容易性 ● Double の再利用性
  • 9. Configuring the Test Double(2) ● Fake は SUT から使われるだけなのでランタイ ムに設定される必要なし ● Dummy は実行されないので設定の必要なし ● Procedual Test Stub は Hard-Coded の代表 例 ●
  • 10. Configuring the Test Double(3) ● Configurable Test Double の設定方法 ● Configuration Interface ● Configuration Mode ● 利点 ● テスト間での再利用性が高い ● 値がテストコード内に書かれるので理解しやすい – Mystery Guest アンチパターンを防ぐ ● 設定場所は fixture setup と同じ扱い
  • 11. Installing the Test Double ● “install” という言葉 ● 基本的な流れ ● Test Double のインスタンス化 ● Configurable Test Double な場合は設定する ● 「 Test Double を使え」とSUT の実行前か実行時 に伝える ● “install” 方法は何種類かある ● 種類の選択はテスト容易性の設計といえる ● 選択の余地が無い場合も多いが、再設計もあるよ!
  • 12. Installing the Test Double(2) ● 基本的な選択肢は三つ ● Dependency Injection ● Dependency Lookup ● Test Hook ● IoC フレームワークが提供されている言語の場 合にはいろいろ仕組みを自分で作らずに済む
  • 13. Dependency Injection ● SUT が依存を自ら探すのではなく、誰かがラン タイムに外から設定する ● 偽者を渡しやすいので TDD との相性◎ ● 依存性解決に関する知識が SUT から無くなる ので SUT の再利用性も大幅 UP ● 3 types ● Setter Injection ● Constructor Injection ● Parameter Injection
  • 14. Dependency Lookup ● テスト容易性を設計に組み込んでいなかった り、Dependency Injection の仕組みが言語に 無い場合に使う ● SUT が誰かに DOC の作成を依頼する ● DOC の生成知識自体は SUT は持たない ● 「誰か」は有名人になってしまう ● 2 types (あまり違いは無い) ● Object Factory (GoF) ● Service Locator (PofEAA)
  • 16. Test-Specific Subclass ● DI も DL も無くても、まだ諦めてはいけない ● 介入可能な仕組みを組み上げてもがこう ● Singleton 死すべし ● DI 可能な仕組みを備えた、SUT のサブクラスを 作成する ● テストに必要な部分に関して、 SUT のオーバーライ ドを行う ● でも SUT が non-private な self-call をする必要が ある
  • 17. Test-Specific Subclass(2) ● DOC のサブクラスを作成する手もある ● Subclassed Test Double になる ● SUT のサブクラス作成よりは相対的に安全
  • 18. Other Ways (最後の手段) ● Test Hooks ● Test Logic in Production ● レガシーコードからの第一手として ● さらなる手段は WEwLC にたくさんあるよ! ● Object Seam とか ● Dependency Breaking Technique の宝庫 – でも使わない状況になるのが一番幸せ ● AOP もある