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);
}
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 の代表
例
●