Soumettre la recherche
Mettre en ligne
Unit test in android
•
5 j'aime
•
1,917 vues
Tatsuya Maki
Suivre
Unit test in Android using Robolectric.
Lire moins
Lire la suite
Technologie
Signaler
Partager
Signaler
Partager
1 sur 92
Télécharger maintenant
Télécharger pour lire hors ligne
Recommandé
Xtend30分クッキング やきに駆動
Xtend30分クッキング やきに駆動
Shinichi Kozake
Inside Frontend 2 #insideFE
Inside Frontend 2 #insideFE
Hiroyuki Anai
Xtend30分クッキング
Xtend30分クッキング
Shinichi Kozake
Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説
JPCERT Coordination Center
CLRH_120414_WFTDD
CLRH_120414_WFTDD
Tomoyuki Obi
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Takefumi MIYOSHI
ゲンバのSwift
ゲンバのSwift
Yuichi Adachi
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
Recommandé
Xtend30分クッキング やきに駆動
Xtend30分クッキング やきに駆動
Shinichi Kozake
Inside Frontend 2 #insideFE
Inside Frontend 2 #insideFE
Hiroyuki Anai
Xtend30分クッキング
Xtend30分クッキング
Shinichi Kozake
Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説
JPCERT Coordination Center
CLRH_120414_WFTDD
CLRH_120414_WFTDD
Tomoyuki Obi
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Takefumi MIYOSHI
ゲンバのSwift
ゲンバのSwift
Yuichi Adachi
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
Clojrue 13 testing
Clojrue 13 testing
Kiyotaka Kunihira
Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説
JPCERT Coordination Center
Async design with Unity3D
Async design with Unity3D
Kouji Hosoda
今日からはじめるGPars
今日からはじめるGPars
fumokmm
Synthesijer hls 20150116
Synthesijer hls 20150116
Takefumi MIYOSHI
あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)
Takuya Tsuchida
xUnit Test Patterns - Chapter19
xUnit Test Patterns - Chapter19
Takuto Wada
About Jobs
About Jobs
Shinichi Kozake
Qunit再入門 (Version 1.10.0 編)
Qunit再入門 (Version 1.10.0 編)
Koji Nakamura
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
なおき きしだ
Ecmascript2015とその周辺について
Ecmascript2015とその周辺について
豊明 尾古
Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)
Uehara Junji
Javascript basic code
Javascript basic code
Shinsuke Matsuda
Ajax 応用
Ajax 応用
Katsuyuki Seino
VerilatorとSystemC
VerilatorとSystemC
Mr. Vengineer
基礎からのCode Contracts
基礎からのCode Contracts
Yoshifumi Kawai
Apache Wicketのユニットテスト機能
Apache Wicketのユニットテスト機能
Hiroto Yamakawa
Unityで覚えるC#
Unityで覚えるC#
Masamitsu Ishikawa
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話
Hisateru Tanaka
Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.
Yuki Higuchi
Junit4
Junit4
ichikaz3
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
Tomohiro Kumagai
Contenu connexe
Tendances
Clojrue 13 testing
Clojrue 13 testing
Kiyotaka Kunihira
Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説
JPCERT Coordination Center
Async design with Unity3D
Async design with Unity3D
Kouji Hosoda
今日からはじめるGPars
今日からはじめるGPars
fumokmm
Synthesijer hls 20150116
Synthesijer hls 20150116
Takefumi MIYOSHI
あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)
Takuya Tsuchida
xUnit Test Patterns - Chapter19
xUnit Test Patterns - Chapter19
Takuto Wada
About Jobs
About Jobs
Shinichi Kozake
Qunit再入門 (Version 1.10.0 編)
Qunit再入門 (Version 1.10.0 編)
Koji Nakamura
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
なおき きしだ
Ecmascript2015とその周辺について
Ecmascript2015とその周辺について
豊明 尾古
Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)
Uehara Junji
Javascript basic code
Javascript basic code
Shinsuke Matsuda
Ajax 応用
Ajax 応用
Katsuyuki Seino
VerilatorとSystemC
VerilatorとSystemC
Mr. Vengineer
基礎からのCode Contracts
基礎からのCode Contracts
Yoshifumi Kawai
Apache Wicketのユニットテスト機能
Apache Wicketのユニットテスト機能
Hiroto Yamakawa
Unityで覚えるC#
Unityで覚えるC#
Masamitsu Ishikawa
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話
Hisateru Tanaka
Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.
Yuki Higuchi
Tendances
(20)
Clojrue 13 testing
Clojrue 13 testing
Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説
Async design with Unity3D
Async design with Unity3D
今日からはじめるGPars
今日からはじめるGPars
Synthesijer hls 20150116
Synthesijer hls 20150116
あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)
xUnit Test Patterns - Chapter19
xUnit Test Patterns - Chapter19
About Jobs
About Jobs
Qunit再入門 (Version 1.10.0 編)
Qunit再入門 (Version 1.10.0 編)
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Ecmascript2015とその周辺について
Ecmascript2015とその周辺について
Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)
Javascript basic code
Javascript basic code
Ajax 応用
Ajax 応用
VerilatorとSystemC
VerilatorとSystemC
基礎からのCode Contracts
基礎からのCode Contracts
Apache Wicketのユニットテスト機能
Apache Wicketのユニットテスト機能
Unityで覚えるC#
Unityで覚えるC#
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話
Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.
Similaire à Unit test in android
Junit4
Junit4
ichikaz3
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
Tomohiro Kumagai
iTamabi 13 第7回:ARTSAT API 実践 2 衛星の情報で表現する
iTamabi 13 第7回:ARTSAT API 実践 2 衛星の情報で表現する
Atsushi Tadokoro
Android test tutorial
Android test tutorial
Kazuaki Ueda
Java EE8 Report
Java EE8 Report
Norito Agetsuma
xUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency Injection
Takuto Wada
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイド
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイド
Yuichi Sakuraba
Sencha ug3 siesta_share
Sencha ug3 siesta_share
久司 中村
Ruby test double
Ruby test double
Naotoshi Seo
JavaのGenericsとは?
JavaのGenericsとは?
Kenji Nakamura
Local php-100828 2
Local php-100828 2
Akio Ishida
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
Swift 2.0 で変わったところ「前編」 #cswift
Swift 2.0 で変わったところ「前編」 #cswift
Tomohiro Kumagai
Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使う
Tatsumi Naganuma
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
JustSystems Corporation
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
Yu Nobuoka
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration
Kazuki Nakajima
FlexUnit4とMockitoFlex
FlexUnit4とMockitoFlex
Yasuhiro Morikawa
Unit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFX
Shinya Mochida
Effective Java 輪読会 項目66-68
Effective Java 輪読会 項目66-68
Appresso Engineering Team
Similaire à Unit test in android
(20)
Junit4
Junit4
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
iTamabi 13 第7回:ARTSAT API 実践 2 衛星の情報で表現する
iTamabi 13 第7回:ARTSAT API 実践 2 衛星の情報で表現する
Android test tutorial
Android test tutorial
Java EE8 Report
Java EE8 Report
xUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency Injection
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイド
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイド
Sencha ug3 siesta_share
Sencha ug3 siesta_share
Ruby test double
Ruby test double
JavaのGenericsとは?
JavaのGenericsとは?
Local php-100828 2
Local php-100828 2
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
Swift 2.0 で変わったところ「前編」 #cswift
Swift 2.0 で変わったところ「前編」 #cswift
Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使う
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration
FlexUnit4とMockitoFlex
FlexUnit4とMockitoFlex
Unit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFX
Effective Java 輪読会 項目66-68
Effective Java 輪読会 項目66-68
Dernier
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
Yuki Kikuchi
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
Hiroshi Tomioka
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
UEHARA, Tetsutaro
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
FumieNakayama
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
akihisamiyanaga1
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
博三 太田
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NTT DATA Technology & Innovation
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
FumieNakayama
Dernier
(8)
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
Unit test in android
1.
ユニットテスト入門 Androidアプリケーションへのユニットテスト導入
2.
Tatsuya Maki Android Application
Developer
3.
はなすこと 1. ユニットテストの導入 2. 効率的なユニットテスト 3.
ユニットテストのTips
4.
ユニットテストの導入 1
5.
Q. ユニットテストとは
6.
A. メソッドなど小さな単位で行うテスト
7.
public static String
fizzbuzz(int value) { String message; if (value % 15 == 0) { message = "FizzBuzz"; } else if (value % 5 == 0) { message = "Buzz"; } else if (value % 3 == 0) { message = "Fizz"; } else { message = String.valueOf(value); } return message; } FizzBuzz
8.
@Test public void fizzbuzzShouldReturnBuzzWhenValueIs10()
{ // 実行結果 String actualValue = fizzbuzz(10); ! // 期待結果 String expectedValue = "Buzz"; ! // テスト assertThat(actualValue, is(expectedValue)); } FizzBuzzTest
9.
Androidでの問題点 1. デバイスが必須 2. 実行速度が遅い 3.
テストしにくい
10.
Robolectric http://robolectric.org/
11.
12.
遅い DalvikVM 必要 JUnit3 速い JVM 不要 JUnit4 AndroidTestCase 実行速度 VM デバイス JUnit Robolectric
13.
14.
TextView Shadow getText() Hello, world.
15.
@Implements(TextView.class) class MyShadowTextView extends
ShadowView { ! @Implementation public CharSequence getText() { return "Hello, Robolectric!"; } ! } Shadowの例
16.
@Test @Config(shadows = {
MyShadowTextView.class }) public void getTextShouldReturnHelloRobolectric() { // SetUp Context context = Robolectric.application.getApplicationContext(); TextView textView = new TextView(context); // Exercise CharSequence actualText = textView.getText(); // Verify assertEquals(actualText, "Hello, Robolectric!"); } Shadowの利用例
17.
まとめ 1. デバイスが不要 2. JVM上で動作する 3.
Shadowオブジェクト
18.
効率的なユニットテスト 2
19.
3つのツール 1. FEST 2. Mockito 3.
EclEmma
20.
FEST https://code.google.com/p/fest/
21.
Q.アサーションとは
22.
A. 実行結果と期待結果を比較検証する宣言
23.
// 実行結果 int actualValue
= 10 / 2; ! // 期待結果 int expectedValue = 5; ! // "10 / 2"が"5"と等しくなることを表明 assertEquals(actualValue, expectedValue); アサーションの例
24.
FESTのメリット 1. アサーションの記述が容易 2. エラーメッセージが明確 3.
Androidと親和性が高い
25.
アサーションの記述が容易
26.
// Exercise List<String> devices
= new ArrayList<String>(); devices.add("Nexus 5"); devices.add("Nexus 7"); ! ! // Verify assertNotNull(devices); assertEquals(2, devices.size()); assertTrue(devices.contains("Nexus 5")); JUnit
27.
// Exercise List<String> devices
= new ArrayList<String>(); devices.add("Nexus 5"); devices.add("Nexus 7"); ! ! // Verify assertThat(devices, is(notNullValue())); assertThat(devices.size(), is(equalTo(2))); assertThat(devices, hasItem("Nexus 5")); Hamcrest
28.
// Exercise List<String> devices
= new ArrayList<String>(); devices.add("Nexus 5"); devices.add("Nexus 7"); ! ! // Verify assertThat(devices) .isNotNull() .hasSize(2) .contains("Nexus 5"); FEST
29.
エラーメッセージが明確
30.
// テストコード List<String> devices
= new ArrayList<String>(); devices.add("Nexus 5"); devices.add("Nexus 7"); assertTrue(devices.contains("Nexus 4")); ! ! // エラーメッセージ java.lang.AssertionError ! ! ! ! JUnit
31.
// テストコード List<String> devices
= new ArrayList<String>(); devices.add("Nexus 5"); devices.add("Nexus 7"); assertThat(devices, hasItem("Nexus 4")); ! ! // エラーメッセージ java.lang.AssertionError: Expected: a collection containing "Nexus 4" but: was "Nexus 5", was "Nexus 7” ! ! Hamcrest
32.
// テストコード List<String> devices
= new ArrayList<String>(); devices.add("Nexus 5"); devices.add("Nexus 7"); assertThat(devices).contains("Nexus 4"); ! ! // エラーメッセージ java.lang.AssertionError: expecting: <['Nexus 5', 'Nexus 7']> to contain: <['Neuxus 4']> but could not find: <['Neuxus 4']> FEST
33.
Androidと親和性が高い
34.
// テストコード TextView textView
= (TextView) activity .findViewById(R.id.text_view); assertThat(textView.getText()) .isEqualTo(activity.getString(R.string.message)); assertThat(textView.getVisibility()) .isEqualTo(View.VISIBLE); ! ! // エラーメッセージ org.junit.ComparisonFailure: expected: <[0]> but was: <[8]> FEST
35.
// テストコード TextView textView
= (TextView) activity .findViewById(R.id.text_view); assertThat(textView) .hasText(R.string.message) .isVisible(); ! ! ! // エラーメッセージ java.lang.AssertionError: Expected to be visible but was gone ! FEST Android
36.
Mockito http://mockito.org/
37.
Q. モックオブジェクトとは
38.
A. オブジェクトの呼び出しを検証する
39.
class MockInputStream extends
InputStream { ! private boolean mIsRead; private boolean mIsClosed; ! @Override public int read() throws IOException { mIsRead = true; return 0; } ! public boolean isRead() { return mIsRead; } ! @Override public void close() throws IOException { mIsClosed = true; } ! public boolean isClosed() { return mIsClosed; } ! } モックオブジェクトの例
40.
Mockitoでできること 1. 呼び出しの検証 2. 振る舞いの変更 3.
フィールドの変更
41.
// モックオブジェクトの生成 InputStream mocked
= mock(InputStream.class); // InputStreamをクローズする mocked.close(); ! // closeメソッドの呼び出し検証 verify(mocked).close(); 呼び出しの検証
42.
振る舞いの変更 // モックオブジェクトの作成 InputStream mocked
= mock(InputStream.class); ! // 戻り値の変更 when(mocked.read()).thenReturn(-1); ! // 例外の送出 when(mocked.read()).thenThrow(new IOException()); ! // ロジックの変更 when(mocked.read()).thenAnswer(new Answer<Integer>() { ! @Override public Integer answer(InvocationOnMock invocation) throws Throwable { int length; ... return length; } });
43.
フィールドの変更 // 内部にInputStreamを保持するクラス MyObject object
= new MyObject(); // フィールドの取得 InputStream stream = (InputStream) Whitebox .getInternalState(object, “mStream"); ! // スパイオブジェクトの作成 Socket spied = spy(stream); ! // フィールドの変更 Whitebox .setInternalState(object, "mStream", spied);
44.
Mockitoでできないこと 1. finalクラス/メソッドのモック 2. privateメソッドのモック 3.
staticメソッドのモック
45.
EclEmma http://www.eclemma.org/
46.
Q. カバレッジとは
47.
A. テストがどれだけ網羅できているか
48.
カバレッジの種類 C0: 命令網羅率 C1: 分岐網羅率 C2:
条件網羅率
49.
EclEmmaで測定できるもの C0: 命令網羅率 C1: 分岐網羅率 C2:
条件網羅率
50.
EclEmmaで測定できないもの C0: 命令網羅率 C1: 分岐網羅率 C2:
条件網羅率
51.
ユニットテストのTips 3
52.
Q. void型メソッドをテストしたい
53.
A. 別のメソッドを使って検証する
54.
List<String> list =
new MyList<String>(); list.add("Android"); // 別のメソッドで検証 assertThat(list).hasSize(1); サンプル
55.
A. メソッドの呼び出しを検証する
56.
InputStream mocked =
mock(InputStream.class); IoUtils.close(mocked); ! // closeメソッドの呼び出し検証 verify(mocked).close(); サンプル
57.
Q. privateメソッドをテストしたい
58.
A. 諦める
59.
A. package privateに変更する
60.
// privateメソッドなので呼び出せない private String
buildMessage() { String message; // do something return message; } ! // package privateに変更 String buildMessage() { String message; // do something return message; } サンプル
61.
Q. 非同期処理をテストしたい
62.
A. CountDownLatchを使う
63.
// timeoutを指定 @Test(timeout =
1000) public void test() throws InterruptedException{ CountDownLatch latch = new CountDownLatch(1); AsyncProcess.execute(new Callback() { @Override public void onComplete() { // 処理完了時にcountDownを呼出 latch.countDown(); } }); ! // 処理完了まで待機 latch.await(); ! ... } サンプル
64.
Q. HTTP通信の外部依存をなくしたい
65.
A. FakeHttpLayerを使う HttpClientの場合
66.
// 常に同じレスポンスを返却 FakeHttpLayer layer
= Robolectric.getFakeHttpLayer(); layer.setDefaultHttpResponse(200, "Hello, World!"); ! ! // 順番にレスポンスを変更 FakeHttpLayer layer = Robolectric.getFakeHttpLayer(); layer.addPendingHttpResponse(200, "Hello, Nexus 4!"); layer.addPendingHttpResponse(200, "Hello, Nexus 5!"); layer.addPendingHttpResponse(200, "Hello, Nexus 7!"); ! ! // 動的にレスポンスを変更 FakeHttpLayer layer = Robolectric.getFakeHttpLayer(); layer.addHttpResponseRule(new MyResponseRule()); サンプル
67.
A. URLStreamHandlerを設定する HttpURLConnectionの場合
68.
class StubURLStreamHandler extends
URLStreamHandler { @Override protected URLConnection openConnection(URL url) throws IOException { // HttpURLConnectionを作成 return new StuHttpURLConnection(url); } } ! class StubURLStreamHandlerFactory implements URLStreamHandlerFactory { @Override public URLStreamHandler createURLStreamHandler( String protocol) { // URLStreamHandlerを作成 return new StubURLStreamHandler(); } } ! // URLStreamHandlerFactoryを設定 URL.setURLStreamHandlerFactory( new StubURLStreamHandlerFactory()); サンプル
69.
Q. データベースのスローテストを解消したい
70.
A. インメモリデータベースを使う
71.
// DatabaseMapのinterfaceを実装 class MemoryDatabaseMap
implements DatabaseMap { ! @Override public String getDriverClassName() { return JDBC.class.getName(); } ! @Override public String getConnectionString(File file) { // インメモリデータベースを使うように指定 return "jdbc:sqlite::memory:"; } ! @Override public String getMemoryConnectionString() { // インメモリデータベースを使うように指定 return "jdbc:sqlite::memory:"; } ! @Override public int getResultSetType() { return ResultSet.TYPE_FORWARD_ONLY; } ! @Override public String getSelectLastInsertIdentity() { return "SELECT last_insert_rowid() AS id"; } ! } サンプル
72.
// UsingDatabaseMapで指定 @UsingDatabaseMap(MemoryDatabaseMap.class) @RunWith(RobolectricTestRunner.class) class DatabaseHelperTest
{ ... } サンプル
73.
Q. Activityをテストしたい
74.
A. ActivityControllerを使う
75.
// ActivityControllerを生成 ActivityController<MainActivity> controller
= Robolectric.buildActivity(MainActivity.class); ! // Activityの生成 controller.create().start().resume().visible(); ! // Activityの取得 MainActivity activity = controller.get(); // Activityの操作 TextView textView = (TextView) activity .findViewById(R.id.text_view); ... ! // Activityの破棄 controller.pause().stop().destroy(); サンプル
76.
Q. Serviceを検証したい
77.
A. ライフサイクルに合わせてメソッドを呼び出す
78.
private MyService mService; ! @Before public
void setUp() { // Serviceを生成 mService = new MyService(); mService.onCreate(); } @Test public void test() { // Serviceを実行 Intent intent = new Intent(Intent.ACTION_SEARCH); intent.putExtra(SearchManager.QUERY, "Hello, World!"); mService.onStartCommand(intent, 0, 0); } ! @After public void tearDown() { // Serviceを破棄 mService.onDestroy(); } サンプル
79.
Q. Widgetのテストをしたい
80.
A. ShadowAppWidgetManagerを使う
81.
// ShadowAppWidgetManagerの生成 Context context
= Robolectric.application .getApplicationContext(); AppWidgetManager manager = AppWidgetManager.getInstance(context); ShadowAppWidgetManager shadowManager = Robolectric.shadowOf(manager); // Widgetの生成 int widgetId = shadowManager.createWidget( MyWidgetProvider.class, R.layout.activity_main); // Viewの取得 View widgetView = shadowManager.getViewFor(widgetId); ! ... サンプル
82.
Q. ContentProviderのテストをしたい
83.
A. ShadowContentResolverを使う
84.
// ShadowContentResolverの生成 ContentResolver resolver
= Robolectric.application.getContentResolver(); ShadowContentResolver shadowResolver = Robolectric.shadowOf(resolver); ! // ContentProviderの登録 shadowResolver.registerProvider( “com.example.android.unittest” new MyContentProvider()); ... // INSERTステートメントの取得 List<InsertStatement> insertStatements = shadowResolver.getInsertStatements(); // UPDATEステートメントの取得 List<UpdateStatement> updateStatements = shadowResolver.getUpdateStatements(); // DELETEステートメントの取得 List<DeleteStatement> deleteStatements = shadowResolver.getDeleteStatements(); // notifyChangeで通知されたURIの取得 List<NotifiedUri> notifiedUris = shadowResolver.getNotifiedUris(); サンプル
85.
Q. BroadcastReceiverのテストをしたい
86.
A. ShadowApplicationを使う
87.
// 事前処理 ShadowApplication shadowApplication
= Robolectric.getShadowApplication(); Context context = Robolectric.application.getApplicationContext(); // 登録済みBroadcastReceiverの取得 List<Wrapper> registered = shadowApplication.getRegisteredReceivers(); // Intentに該当するBroadcastReceiverの取得 Intent intent = new Intent("MY_ACTION"); List<BroadcastReceiver> receivers = shadowApplication.getReceiversForIntent(intent); // Intentを擬似的に受信 BroadcastReceiver receiver = receivers.get(0); receiver.onReceive(context, intent); サンプル
88.
まとめ 4
89.
まとめ 1. 課題はRobolectricで解消できる 2. 既存のライブラリを使って効率的に 3.
大体テストできるので書いてみよう
90.
Q. おすすめの本はなんですか
91.
92.
https://github.com/t28hub/UnitTestInAndroid/
Télécharger maintenant