mock object

20
Mock Object 201135日土曜日

Upload: hiroyuki-ohnaka

Post on 15-Jan-2015

1.091 views

Category:

Technology


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Mock object

Mock Object

2011年3月5日土曜日

Page 2: Mock object

How it works

SUTの依存オブジェクトと同じインターフェースを持つ

Mock Objectに SUTがどのような値を返し、メソッドを呼び出すかの期待値を設定する。

実際の引数を受け取って、期待される引数と比較し、マッチしなければ、テストを失敗させる

テストケースには、アサーションは必要ありません!

2011年3月5日土曜日

Page 3: Mock object

When to use it

Untested Requirementを避けるために使わる。(pp.273)

↑ログ出力がテストされていない

2011年3月5日土曜日

Page 4: Mock object

Mock Objectツールキットとして見かけるものの多くは、使用例はTest Stubであることに注意する必要がある。

多くは、比較のためにequalsメソッドを使用する。

テストのために特有な比較が必要な場合は、Mock Object

は使用できないかもしれないし、もしくはそこしか使わないequalsメソッドを用意する必要がある→Equality Pollution

(pp.217)

2011年3月5日土曜日

Page 5: Mock object

Mock Objectの実装のなかには、Equality

Assertionsのときに特定のcomparatorを使うことによって、この問題を回避しているものがある

Mock Objectは厳密であることもできますし、寛大となることもできる。

厳密なMock Objectは、Mock Objectで指定したのと違うオーダーが渡ってきた場合は、テストを失敗させる。寛大なMock Objectは、多めに見る。

2011年3月5日土曜日

Page 6: Mock object

Mock Objectを使って書かれるテストは、SUT

のエクササイズの前に、期待される振る舞いを指定する必要があるということで、他のテストとは違った側面があり、このためテストを書くこと、理解することが難しくなる。このため、Test Spy を使う方が好まれる。

Implementation Notes

2011年3月5日土曜日

Page 7: Mock object

Mock Objectを使う場合は標準的な4フェーズテストのfixtureのセットアップのフェーズが、他の3つのフェーズにブレークダウンするとともに、result verification phaseが現れない。(“final verification”を使っている場合を除く。)

2011年3月5日土曜日

Page 8: Mock object

Fixture SetupMockObjectの生成/設定

Exercise SUTMocK Objectの呼び出し、検証

Result verificationテストは“final verification”を呼び出す。

Fixture teardown他のテストとかわらない。

2011年3月5日土曜日

Page 9: Mock object

ConstructionFour-Phase Testのfixture setup phaseと同じように、Mock Objectを依存する物の代わりとして生成する必要があります。

Configuration with Expected ValuesTest Doubleのインストール前に、Mock

Objectがどのように呼ばれるのが期待されるのかを設定する必要がある。→Hard-Coded Test Doubleの場合は不要

2011年3月5日土曜日

Page 10: Mock object

InstallationTest DoubleをSUTが使用できるようになるためには、一種のインストールを行う必要があるSUTの依存関係を代替するパターンであれば、なんでもよい。Dependency InjectionやDependency Lookup

がありますが、後者の方が好まれるようです。

2011年3月5日土曜日

Page 11: Mock object

UsageSUTがMock Objectのメソッドを呼び出すと、それらのメソッドは呼び出し値を期待値と比較します。もしメソッド呼び出しが期待されていないものであった場合、明示的にAssertionを失敗させます。(寛大なMock Objectは、メソッド呼び出しを受け取って、そのまま処理を続けることに、注意する必要があります。)

2011年3月5日土曜日

Page 12: Mock object

もしメソッドが出力パラメータや、返り値を持つ場合は、Mock ObjectはSUTがテストシナリオを続行するに足りる値を返すか、何らかの値に更新する必要がある。→happy pathを通す値を返すこと以外は、このことはテストスタブと一緒です。

2011年3月5日土曜日

Page 13: Mock object

Final Verification不幸にして1回も呼ばれなかった場合に、テストを失敗させる。いくつかのMock Object toolkitsは、teardown

のときに自動的にメソッドを自動的に呼び出します。大抵のツールは、final Verification

Methodを自分で呼び出す必要があります。

2011年3月5日土曜日

Page 14: Mock object

Motivating Example

2011年3月5日土曜日

Page 15: Mock object

Refactoring Notes

依存性をTest Doubleに置き換える

Mock Objectの期待されるメソッド呼び出しや、引数、帰すべき値は、SUTの依存性を付け替える仕組みによってインストールされます。

テストの最後に、Mock Objectが少なくとも1回呼ばれたかを検証する、final verification methodを加える。

2011年3月5日土曜日

Page 16: Mock object

2011年3月5日土曜日

Page 17: Mock object

2011年3月5日土曜日

Page 18: Mock object

JUnit3では、Mock ObjectがTestCaseのサブクラスではないために、Assertion Methodをstatic

メソッドとして呼び出している。

他のxUnit Familyでは、NUnitはstaticメソッドとしてのみAssertクラスのメソッドを提供しているので、テストメソッドを使うことが出来ます。RubyのTest::Unitでは、mixinsを使用してAssertメソッドを提供しているので、普通に呼び出すことができる。

2011年3月5日土曜日

Page 19: Mock object

Example: Mock Object (Dynamically Generated)

2011年3月5日土曜日

Page 20: Mock object

Further Reading

大抵のxUnitについての書籍はMock Objectについて言及しているので、ここで一覧にはしないが、他の本を読むときは、Mock Object

がTest StubやFake Objectのことを指している場合があることに注意する必要があります。→Appnendix B(pp.741)参照

2011年3月5日土曜日