Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Symfony勉強会#6 オブジェクトの振舞を明確化するためのモックについて
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
hidenorigoto
June 30, 2012
Technology
1.4k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Symfony勉強会#6 オブジェクトの振舞を明確化するためのモックについて
hidenorigoto
June 30, 2012
More Decks by hidenorigoto
See All by hidenorigoto
ドメインと向き合う - 旅行予約編
hidenorigoto
4
1.2k
「ソフトウェア設計」のドメイン - 「データモデリングでドメインを駆動する」を読んで
hidenorigoto
10
3.5k
メルカリ バックエンド領域のこれまでとこれから
hidenorigoto
1
610
メルカリのエンジニアリング組織の変化〜Engineering Managerの視点から〜
hidenorigoto
0
8.7k
The changes of the engineering organization in Mercari - from the view of an engineering manager -
hidenorigoto
0
340
PHPerKaigi 2019 ランチセッション (3/31)
hidenorigoto
1
4.5k
抽象化って何? (What is abstraction?)
hidenorigoto
9
4.8k
抽象化って何? (What is abstraction?)
hidenorigoto
11
7.6k
続・SOLIDの原則ってどんなふうに使うの? 〜オープン・クローズドの原則 センパイのコーディングノート編〜
hidenorigoto
14
6.4k
Other Decks in Technology
See All in Technology
データサイエンスを価値につなげるプロジェクト設計 〜 DS一年目が現場で得た気づき 〜
ysd113
1
270
Kubernetesにおける学習基盤とLLMOpsの概要
ry
1
310
気軽に使える"情報のハブ"としてのNotion活用 〜フロー情報の集積点 と、 Claude Code × Notion AI〜
syucream
1
150
いまさら聞けない「仕様駆動開発入門」 〜AI活用時代の開発プロセスを考える〜
findy_eventslides
2
150
2026 TECHFRESH 畢業分享會 - 開發日常大解密!從領域驅動到企業級上線
line_developers_tw
PRO
0
1.2k
スキルと MCP ツール、責務をどう分けるか? AI が迷わないインターフェース設計の戦略
cdataj
1
1.1k
SONiCのLinuxベースを活かしたZabbix監視
sonic
0
190
不要なレビューをAIにまかせて AIコーディングの環境改善を加速した
shoota
1
200
ACE-Step-1.5で見る 音楽生成AIのしくみと“破綻だけ直す”Retake機能の開発【zennfes spring 2026 登壇資料】
personabb
1
520
白金鉱業Meetup_Vol.24_「AIエージェントは分けるほど良い」は本当か? / Is it true that “the more you divide AI agents, the better”?
brainpadpr
1
400
エラーバジェットのアラートのタイミングを考える.pdf
kairim0
0
160
2026TECHFRESH畢業分享會 - Lightning Talk - 打造精準高效的 MCP 設計模式與測試實務
line_developers_tw
PRO
0
1.2k
Featured
See All Featured
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.1k
ラッコキーワード サービス紹介資料
rakko
1
3.7M
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
390
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
370
Scaling GitHub
holman
464
140k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
210
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Mind Mapping
helmedeiros
PRO
1
250
Transcript
オブジェクトの振舞を 明確化するためのモック PHPメンターズ/日本Symfonyユーザー会 後藤 秀宣 @hidenorigoto 1 Symfony勉強会 #6 126݄30༵
後藤秀宣(ごとうひでのり) PHPメンターズ 2 126݄30༵
後藤秀宣(ごとうひでのり) PHPメンターズ • Symfonyユーザー会 2 126݄30༵
後藤秀宣(ごとうひでのり) PHPメンターズ • Symfonyユーザー会 • Symfony Midnight 2 126݄30༵
後藤秀宣(ごとうひでのり) PHPメンターズ • Symfonyユーザー会 • Symfony Midnight • 翻訳温泉ツアー 2
126݄30༵
後藤秀宣(ごとうひでのり) PHPメンターズ • Symfonyユーザー会 • Symfony Midnight • 翻訳温泉ツアー •
WEB+DB PRESS 2 126݄30༵
3 WEB+DB PRESS vol. 69 126݄30༵
4 WEB+DB PRESS vol.70 126݄30༵
4 WEB+DB PRESS vol.70 • オブジェクト指向設計の 視点から見たモックフ レームワークの使い方 (Phake、Mockery) 126݄30༵
何の話をするの? 5 126݄30༵
何の話をするの? • ソフトウェアテスト寄りの話ではありま せん 5 126݄30༵
何の話をするの? • ソフトウェアテスト寄りの話ではありま せん • オブジェクト指向設計寄りの話です 5 126݄30༵
何の話をするの? • ソフトウェアテスト寄りの話ではありま せん • オブジェクト指向設計寄りの話です • Symfonyのテストコードを例に話します。 Symfonyのテストコードを読めるようにな ります
5 126݄30༵
モックオブジェクトとは? 6 126݄30༵
モックオブジェクトとは? • モックオブジェクト 6 126݄30༵
モックオブジェクトとは? • モックオブジェクト • テストダブルの1つ 6 126݄30༵
モックオブジェクトとは? • モックオブジェクト • テストダブルの1つ • テストの時に使う、代理オブジェク ト 6 126݄30༵
モックオブジェクトとは? • モックオブジェクト • テストダブルの1つ • テストの時に使う、代理オブジェク ト • テストコード側からメソッドの挙動
などを動的に定義(置き換え) 6 126݄30༵
モックオブジェクトとは? • モックオブジェクト • テストダブルの1つ • テストの時に使う、代理オブジェク ト • テストコード側からメソッドの挙動
などを動的に定義(置き換え) • オブジェクトのコラボレーションを検証 できる 6 126݄30༵
環境 7 126݄30༵
環境 • PHPUnitに同梱されたもの 7 126݄30༵
環境 • PHPUnitに同梱されたもの • PHPUnit_MockObject 7 126݄30༵
環境 • PHPUnitに同梱されたもの • PHPUnit_MockObject • PhakeやMockery(別のライブラリ)を PHPUnitと組み合わせて利用することも可 7 126݄30༵
環境 • PHPUnitに同梱されたもの • PHPUnit_MockObject • PhakeやMockery(別のライブラリ)を PHPUnitと組み合わせて利用することも可 • 可読性が高いDSLを提供
7 126݄30༵
PHPUnit_MockObject 8 126݄30༵
PHPUnit_MockObject • モックを生成 8 126݄30༵
PHPUnit_MockObject • モックを生成 • getMock() 8 126݄30༵
PHPUnit_MockObject • モックを生成 • getMock() • getMockBuilder() 8 126݄30༵
PHPUnit_MockObject • モックを生成 • getMock() • getMockBuilder() • disableOriginalConstructor() 8
126݄30༵
PHPUnit_MockObject • モックを生成 • getMock() • getMockBuilder() • disableOriginalConstructor() •
エクスペクテーション定義 8 126݄30༵
PHPUnit_MockObject • モックを生成 • getMock() • getMockBuilder() • disableOriginalConstructor() •
エクスペクテーション定義 • expects() 8 126݄30༵
PHPUnit_MockObject • モックを生成 • getMock() • getMockBuilder() • disableOriginalConstructor() •
エクスペクテーション定義 • expects() • method() 8 126݄30༵
PHPUnit_MockObject • モックを生成 • getMock() • getMockBuilder() • disableOriginalConstructor() •
エクスペクテーション定義 • expects() • method() • will() 8 126݄30༵
Symfonyのテストコード • 例:HttpKernelコンポーネントのKernel クラスのテストコード 9 126݄30༵
10 126݄30༵
11 bootは()バンドルとコンテナを初期化する 126݄30༵
テスト対象をモック化 • これは特殊パターン • 通常はテスト対象オブジェクトはモックにしない • テスト対象と同一オブジェクトのメソッド呼び出し を検証する必要があったため、テスト対象そのもの をモック化している。 •
Phake等でいうパーシャルモック • getMockBuilder()でモック化した後、必要なメソッ ドをsetMethods()で指定。その後expects()でエク スペクテーションを定義。 12 126݄30༵
13 モックを使って • カーネルのboot()メソッド呼び出し時 に、必ず呼び出されるメソッドをテスト している 126݄30༵
13 モックを使って • カーネルのboot()メソッド呼び出し時 に、必ず呼び出されるメソッドをテスト している boot()メソッドの振舞を テストしている 126݄30༵
通常パターン • HttpKernelコンポーネントのKernelクラ スのテストコード 14 126݄30༵
15 126݄30༵
16 bootは()バンドルにコンテナをセットする モック生成 コラボレーション 126݄30༵
17 モックを使って • カーネルのboot()メソッドにより、関連 しているバンドルオブジェクトの setContainer()が呼ばれることをテスト している 126݄30༵
17 モックを使って • カーネルのboot()メソッドにより、関連 しているバンドルオブジェクトの setContainer()が呼ばれることをテスト している 関連オブジェクトとのイ ンタラクションを検証し ている
126݄30༵
関連(隣接)オブジェクト 18 126݄30༵
関連(隣接)オブジェクト 18 126݄30༵
19 関連(隣接)オブジェクト 126݄30༵
19 関連(隣接)オブジェクト • 対象オブジェクトと直接関連を持つオブ ジェクト 126݄30༵
19 関連(隣接)オブジェクト • 対象オブジェクトと直接関連を持つオブ ジェクト • 通常、テストコードでモック化するのは 隣接オブジェクトのみ 126݄30༵
19 関連(隣接)オブジェクト • 対象オブジェクトと直接関連を持つオブ ジェクト • 通常、テストコードでモック化するのは 隣接オブジェクトのみ • 隣接していないオブジェクトのモックを
作る必要がある場合、何か問題がある兆 候 126݄30༵
20 ロール、責務、コラボレーション 126݄30༵
20 ロール、責務、コラボレーション • 責務駆動設計(オブジェクト指向設計) 126݄30༵
20 ロール、責務、コラボレーション • 責務駆動設計(オブジェクト指向設計) • 責務とコラボレーションを中心にクラス を設計していく手法。 126݄30༵
20 ロール、責務、コラボレーション • 責務駆動設計(オブジェクト指向設計) • 責務とコラボレーションを中心にクラス を設計していく手法。 • どのクラスにどの責務を割り当てるの か?
126݄30༵
20 ロール、責務、コラボレーション • 責務駆動設計(オブジェクト指向設計) • 責務とコラボレーションを中心にクラス を設計していく手法。 • どのクラスにどの責務を割り当てるの か?
• CRCカードによるクラスの発見、ロール ステレオタイプによる基本分類 126݄30༵
Kernelの責務 21 126݄30༵
Kernelの責務 • テストコード(KernelTest.php)を見る ことで責務・振舞が分かる 21 126݄30༵
Kernelの責務 • テストコード(KernelTest.php)を見る ことで責務・振舞が分かる • bootは()バンドルとコンテナを初期化す る 21 126݄30༵
Kernelの責務 • テストコード(KernelTest.php)を見る ことで責務・振舞が分かる • bootは()バンドルとコンテナを初期化す る • bootは()バンドルにコンテナをセットす る
21 126݄30༵
Kernelの責務 • テストコード(KernelTest.php)を見る ことで責務・振舞が分かる • bootは()バンドルとコンテナを初期化す る • bootは()バンドルにコンテナをセットす る
• shutdown()はすべてのバンドルの shutdown()を呼び出す 21 126݄30༵
Kernelの責務 • テストコード(KernelTest.php)を見る ことで責務・振舞が分かる • bootは()バンドルとコンテナを初期化す る • bootは()バンドルにコンテナをセットす る
• shutdown()はすべてのバンドルの shutdown()を呼び出す • etc 21 126݄30༵
まとめ 22 126݄30༵
まとめ • オブジェクトを責務とコラボレーション の視点から実装していくにはモックオブ ジェクトの力が必要である 22 126݄30༵
まとめ • オブジェクトを責務とコラボレーション の視点から実装していくにはモックオブ ジェクトの力が必要である • ドメインの複雑な問題に取り組むスキル として、オブジェクト指向設計技術を少 しでも学ぼう 22
126݄30༵
まとめ • オブジェクトを責務とコラボレーション の視点から実装していくにはモックオブ ジェクトの力が必要である • ドメインの複雑な問題に取り組むスキル として、オブジェクト指向設計技術を少 しでも学ぼう •
先人の知見の宝庫 22 126݄30༵
23 ガイドとなる 技術・書籍 126݄30༵
オブジェクト指向設計 • オブジェクトデザイ ン(レベッカ・ワー フスブラック/アラ ン・マクキーン) • ロール、責務、コラ ボレーション:責務 駆動設計についての
実践的な解説 24 126݄30༵
オブジェクト指向開発 • Growing Object- Oriented Software, Guided by Tests(Steve Freeman/Nat
Pryce) • 通称「GOOS本」 • 責務駆動設計とモッ クフレームワークを ベースにテスト駆動 開発する 25 126݄30༵
オブジェクト指向開発 • アジャイルソフト ウェア開発の奥義 (ロバート・C・マー チン) ボブおじさん • アジャイル設計開 発、オブジェクト指
向設計の原則等 26 126݄30༵
27 ありがとう ございました! 126݄30༵