Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Symfony勉強会#6 オブジェクトの振舞を明確化するためのモックについて
Search
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
630
メルカリのエンジニアリング組織の変化〜Engineering Managerの視点から〜
hidenorigoto
0
8.8k
The changes of the engineering organization in Mercari - from the view of an engineering manager -
hidenorigoto
0
350
PHPerKaigi 2019 ランチセッション (3/31)
hidenorigoto
1
4.5k
抽象化って何? (What is abstraction?)
hidenorigoto
9
4.9k
抽象化って何? (What is abstraction?)
hidenorigoto
11
7.8k
続・SOLIDの原則ってどんなふうに使うの? 〜オープン・クローズドの原則 センパイのコーディングノート編〜
hidenorigoto
14
6.4k
Other Decks in Technology
See All in Technology
Von-Neumann Machines, Dreams & The Futures of IT
ufried
0
100
The Knowledge Spine: A Machine-Executable Ontology for Governed Marketing Activation
vananth22
0
110
顧客に向き合う開発組織へ。リアーキテクチャとフィーチャーチーム化で挑む組織改革
safie
0
2.1k
SREの視点で考えるSIEM活用術 〜AWS環境でのセキュリティ強化〜
cscengineer
PRO
0
110
Slack上でインフラをトラブルシュートする! Agentic Platform Engineeringの第一歩
teru0x1
5
1.8k
HRC_Frontend_Conference_Fukuoka_2026.pdf
ts020
0
750
beyond jj: config & tools ecosystem
indirect
0
5.1k
Minecraft JavaのMODをSwiftで作る
1mash0
0
180
アプリログインとWeb認証基盤をつなぐ ASWebAuthenticationSession 作法
shimastripe
1
340
なぜ「決定性」が 決定的に重要なのか? Durable Execution 基盤の数理的理解 #serverlessjp / ServerlessDays Tokyo 2026
ytaka23
3
750
安心して変更できるWebフロントエンドの作り方
pirosikick
5
2.8k
幾何アルゴリズムで なめらかなピン操作を / iOSDC Japan 2026 / smoothpin
kazumanagano
0
360
Featured
See All Featured
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
700
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Code Reviewing Like a Champion
maltzj
528
40k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
3
4.3k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
Designing for Performance
lara
611
70k
Building a Scalable Design System with Sketch
lauravandoore
464
34k
The untapped power of vector embeddings
frankvandijk
2
1.9k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
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༵