スキップしてメイン コンテンツに移動

投稿

1月, 2013の投稿を表示しています

JUnitからAlertDialog.Builderのボタンを押す

たぶんやり方としておかしいというかスマートじゃない思うんですけど、テストやるのに結果として押せりゃいいんだよ押せりゃ... ということで、眠いし、深く検証しないままメモしておきます。 テストケースは、ActivityInstrumentationTestCase2を継承したもので、画面にダイアログが表示されている状態で、以下のコードでボタン押下を確認しました。 [PositiveButtonを押下する] // PositiveButtonボタン押下 sendKeys(KeyEvent.KEYCODE_DPAD_DOWN, KeyEvent.KEYCODE_DPAD_RIGHT); sendKeys(KeyEvent.KEYCODE_DPAD_DOWN, KeyEvent.KEYCODE_DPAD_CENTER); [NegativeButtonを押下する] //NegativeButtonボタン押下 sendKeys(KeyEvent.KEYCODE_DPAD_DOWN, KeyEvent.KEYCODE_DPAD_CENTER); テストケースだと一瞬なので、Thread.sleepとか入れると目視でクリックされるのが確認できると思います。 ※追記(2013/01/29):ただしダイアログ内にほとんど中身(View)がない場合に限る。中身があって、別のViewをタッチしてしまう場合は、KEYCODE_DPAD_RIGHTやKEYCODE_DPAD_LEFTなど、いくつかのキーを送信すればOKボタンまでフォーカスを移動させることができ、最後にsendKeys(KeyEvent.KEYCODE_DPAD_DOWN, KeyEvent.KEYCODE_DPAD_CENTER);を実行するとOKボタンを押せるみたい

JUnitからMenuItemをクリックする方法

ActivityInstrumentationTestCase2を継承したクラスのテストメソッドで確認しました。 getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_MENU); getInstrumentation().invokeMenuActionSync(activity, net.takaiwa.R.id.menu_setting, 0); invokeMenuActionSyncのパラメータは、 第一引数 対象Activity 第二引数 メニューアイテムのID xmlに定義したもの? 第三引数 なんかフラグ XMLではなく動的に追加したメニューの場合は、MenuItemをgetDeclaredFieldなり何らかの形で取得して、getItemIdで第二引数のIDを取得できます。以下、 Class c = mActivity.getClass(); Field field = c.getDeclaredField("mMenuItemHoge"); MenuItem menu_item = field.get(mActivity); getInstrumentation().invokeMenuActionSync(mActivity, menu_item.getItemId(), 0); コンパイル通してないですけど、こんな感じですかね。MenuItemはactivityからたどれそうな気もしますけど。

Javaでprivateなfieldやmethodにアクセスする

JUnitでテストしてると、privateなフィールドにアクセスして、値を参照したりセットしたりしたくなるわけですが、よく使うのでメモしておきます。 例えば、次のような対象のクラスがあるとします。 public class ParentClass { private String hoge = "ParentClass!!"; public void dispMsg() { System.out.println("dispMsg:" + hoge); } private void privateDispMsg(String msg) { System.out.println("dispMsg:" + msg); } }

onCreate実行前にActivity内メソッドの戻り値を差し替てテストしたい。Mockitoで

-------------追記:2015/01/12------------- 書き直しました→ Mockitoを使ってActivityの分岐のテスト ~ takaiwa.net ----------------------------------------- 良いやり方ではないと思うんですけど、力業で解決したので載せておきます。 やりたい事はこの質問者さんとだいたい同じだと思います(Activityの話かどうかわかりませんが) ・onCreateメソッドのテスト - Google グループ https://groups.google.com/forum/#!msg/android-group-japan/0H_wA7IYJ6k/gdqwloJnjR8J setUp()メソッドをオーバーライドしてgetActivity()を記述しても、その時点でonCreateが呼ばれてしまうんですね。何でonCreate前にそんな事をしたいのかと言うと、上記の質問および下記のサンプルソースから察していただければと思うんですけど、 [テスト対象Activity] public class MainActivity extends Activity { private ServerAPI server_api; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(true == isLoggedIn()) { ((TextView)findViewById(R.id.textView1)).setText("Logged In"); } else { ((TextView)findViewById(R.id.textView1)).setText("Not logged in"); } } public b

AndroidのテストをMockitoで

以前 Android Mockを泣きそうになりながら動かしてみた んですが、@ITの記事を書いた方のブログを見つけました。 ・さようならAndroid Mock #android_tec - やらなイカ? http://nowsprinting.hatenablog.com/entry/2012/11/26/130050 Android Mockは3年前、4週間のプロジェクトとして(より自然なソリューションが出てくるまでの)応急的ソリューションとして開発された.... お蔵入りのようなことが書いてあり、またMockitoがAndroidネイティブサポートを正式にマージしたとのことやネットで感触が良いような記事を目にしたので今度はMockito動かしてみたいと思います。僕のやり方がマズいのかまたもや躓いたので、やり方をメモしておきたいと思います。 [参考] ・MockitoをAndroidテストプロジェクトで使用する #android_tec - やらなイカ? http://nowsprinting.hatenablog.com/entry/2012/12/01/091916 ・Androidでmockitoを使ったJUnitの単体テストを動かす #Java #Android - Qiita http://qiita.com/items/c695e59c2220670ebe04 [環境] Eclipse:Helios Service Release 2 Android Development Tools: 21.0.0.v201210310015-519525 OS:Win7 [手順] Downloads - mockito - simpler & better mocking - Google Project Hosting  からmockito-all-1.9.5.jarをダウンロード Downloads - dexmaker - Programmatic code generation for Android. - Google Project Hosting からdexmaker-mockito-1.0.jarとdexmaker-1.0.jarをダウンロード テストプロジェクトのlibsフォルダに上記