2017-08-15 9 views
0

私はAndroidアプリのUIテストを行うためにEspressoを使用しています。エスプレッソルールを使用しているときに、アクティビティのfinish()メソッドでUIを操作できませんか?

公式ガイドの後、私はActivityTestRuleを使ってテスト中のアクティビティを起動しました。しかし、テストが終了すると、クラッシュが発生しました。

スタックトレースが

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6247) 
at android.view.ViewRootImpl.playSoundEffect(ViewRootImpl.java:5222) 
at android.view.View.playSoundEffect(View.java:17876) 
at android.view.View.performClick(View.java:4755) 
at com.example.android.activityinstrumentation.ReadExternalFileActivity.finish(ReadExternalFileActivity.java:196) 
at android.support.test.rule.ActivityTestRule.finishActivity(ActivityTestRule.java:234) 
at android.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:259) 
at org.junit.rules.RunRules.evaluate(RunRules.java:20) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.junit.runners.Suite.runChild(Suite.java:128) 
at org.junit.runners.Suite.runChild(Suite.java:27) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:115) 
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:59) 
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:262) 
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1837) 

は、コールスタックをスローですが、私はAndroidJunitRunnerがクラッシュを引き起こした非UIスレッドから活動の仕上がりを()を呼び出すことを試みました。

My appアクティビティのメソッドfinish()をオーバーライドし、ユーザー確認の終了を確認するダイアログをポップアップします。これはUIスレッドで実行する必要があります。

Espressoを使用しているときに、アクティビティのfinish()メソッドでUI作業を行うことはできませんか?それとも、これはエスプレッソのバグですか?

答えて

0

finish()でUI作業をしないでください。

finish()はこの目的ではありません。 finish()は、ユーザーがそのダイアログにyesと答えた後に起こることです。

アクティビティは、画面に到達するまでに画面から消えます。私は実際にはそれが失敗するのを見てテストケースを取った少し驚いている。

+0

悲しいことに、Androidの公式ドキュメントには書かれていません。見て、私は何年もメソッドの仕上げを誤っていました。 – cmoaciopm

+0

finish()への呼び出しに関連するイベントの正確な順序が定義されていない場合、またはsuper.finish()の呼び出しをメソッドの最後に移動してこの問題を回避できる場合でも、私は全く驚くことはありませんそれに頼ることはお勧めできません。 – JoeHz

0

finish()でUI作業を行うことは許されていますが、通常は最後のダイアログやカーソルなどを閉じて使用するだけです。onDestroyでも行うことができます。

コード抜粋なしでは、コードのどこかにバグがあるかどうかはわかりません。あなたの確認ダイアログをonBackPressedに移動し、ダイアログを追加するだけです。ユーザーが終了することを確認したら、super.onBackPressed()に電話をかけてください。そうでない場合は何もしないでください。

関連する問題