Contenu connexe
Similaire à Androidで使えるモックフレームワーク (20)
Plus de Koji Hasegawa (13)
Androidで使えるモックフレームワーク
- 6. xUnit Test Patternsでの定義
• Test Double == 身代わり、影武者の意
• Test Stub(間接入力を操作する)
• Test Spy(間接出力を記録する)
• Mock Object(間接出力の検証もする)
• Fake Object(偽の間接入力を返す)
• Dummy Object(nullじゃない程度)
- 12. 詳しくは…
• xUnit Test Patterns(洋書)
http://xunitpatterns.com/
http://www.fieldnotes.jp/xutp/ ( 読書会の記録)
• 井芹さんのエントリ
xUnit Test PatternsのTest Doubleパターン(Mock,Stub,Fake,Dummy等の定義)
http://goyoki.hatenablog.com/entry/20120301/1330608789
- 13. モックフレームワークとは
•
Test Double == 身代わり、影武者の意
•
Test Stub(間接入力を操作する)
•
Test Spy(間接出力を記録する)
•
Mock Object(間接出力の検証もする)
•
Fake Object(偽の間接入力を返す)
•
Dummy Object(nullじゃない程度)
全部できる!
しかも動的に
- 22. モックの使用例 1/2
// HTTPステータス500を返すStatusLineモック
StatusLine mockStatusLine
= EasyMock.createMock(StatusLine.class);
EasyMock.expect(mockStatusLine.getStatusCode())
.andReturn(500);
EasyMock.replay(mockStatusLine);
!
(snip)
!
// テスト対象のインスタンスフィールドにある
// HttpClientをモックに差し替える
mFxRateLoader.mHttpclient = mockHttpClient;
- 23. モックの使用例 2/2
// テスト実行
try {
mFxRateLoader.requestFeed();
fail();
!
} catch (InvalidHttpStatusCodeException e) {
// 例外がスローされるのが正しい振る舞い
// ステータスコードが正しいか検証
assertEquals(500, e.getStatusCode());
}
- 24. 例外発生のテスト 1/2
// 通信できない状態の例外をスローするHttpClientモック
Exception expected = new UnknownHostException();
HttpClient mockHttpClient =
EasyMock.createMock(HttpClient.class);
EasyMock.expect(mockHttpClient
.execute((HttpUriRequest)EasyMock.notNull()))
.andThrow(expected);
EasyMock.replay(mockHttpClient);
!
// テスト対象のインスタンスフィールドにある
// HttpClientをモックに差し替える
mFxRateLoader.mHttpclient = mockHttpClient;
- 25. 例外発生のテスト 2/2
// テスト実行
try {
mFxRateLoader.requestFeed();
fail("UnknownHostExceptionがthrowされていない");
!
} catch (UnknownHostException e) {
// 例外がスローされるのが正しい振る舞い
}
- 26. StrictMockの例 1/2
// ダミーのパース結果を返すXmlPullParserモック
XmlPullParser mockParser = EasyMock.createStrictMock(XmlPullParser.class);
mockParser.setInput((InputStream)EasyMock.notNull(), (String)EasyMock.notNull());
EasyMock.expect(mockParser.getEventType()).andReturn(XmlPullParser.START_TAG);
EasyMock.expect(mockParser.getName()).andReturn("gesmes:Envelope");// 無視される
EasyMock.expect(mockParser.next()).andReturn(XmlPullParser.START_TAG);
(snip)
EasyMock.expect(mockParser.getName()).andReturn("Cube");// USD
EasyMock.expect(mockParser.getAttributeValue(null, "currency")).andReturn("USD");
EasyMock.expect(mockParser.getAttributeValue(null, "rate")).andReturn(SEED_EURUSD);
EasyMock.expect(mockParser.next()).andReturn(XmlPullParser.START_TAG);
(snip)
EasyMock.expect(mockParser.next()).andReturn(XmlPullParser.END_TAG); // </gesmes:Envelope>
EasyMock.expect(mockParser.next()).andReturn(XmlPullParser.END_DOCUMENT);
EasyMock.replay(mockParser);
!
// テスト対象のインスタンスフィールドにあるHttpClientをモックに差し替える
mFxRateLoader.mParser = mockParser;
- 27. StrictMockの例 2/2
// テスト実行
InputStream dummyResponseBody
= createDummyInputStream();
FxRate actual
= mFxRateLoader.parseFeed(dummyResponseBody);
assertEquals("EUR/USDは正しくパースされている",
expectedEurusd, actual.eurusd);
assertEquals("EUR/JPYは正しくパースされている",
expectedEurjpy, actual.eurjpy);
- 28. StrictMockの例 2/2
// テスト実行
InputStream dummyResponseBody
= createDummyInputStream();
FxRate actual
= mFxRateLoader.parseFeed(dummyResponseBody);
assertEquals("EUR/USDは正しくパースされている",
parseFeed()内でStrictMockに
expectedEurusd, actual.eurusd);
assertEquals("EUR/JPYは正しくパースされている",
定義した順にメソッドを呼ばれて
expectedEurjpy, actual.eurjpy);
いないと、その場で例外発生
- 31. 買って 買って 買って 買って
買って 買って 買って 買って
買って 買って 買って 買って
買って 買って 買って 買って
買って 買って 買って 買って