私のテストの@Before機能でエスプレッソidlingResourceを登録しようとしていますが、メインスレッドから実行する必要があるというエラーが発生しています。ここに私がこれまで持っていたものがあります:エスプレッソidlingResource - 登録方法?
@Before
public void setUp() throws Exception {
mIntentsTestRule.getActivity().sharedPrefRepo.clearAll();
new Thread(){
@Override
public void run() {
super.run();
IdlingResource loadingDialogIdlingResource = new LoadingDialogIdlingResource();
IdlingRegistry.getInstance().register(loadingDialogIdlingResource);
}
}.start();
}
しかし、この種は意味をなさないです。私はこれらのものを別のスレッドに登録していますが、完了する前にテストを続行しますか?これらのことを本当に登録する方法は何ですか?私はこのようになりますだけでなくティアダウンでの登録解除機能を作成しました:
@After
public void tearDown() throws Exception {
//handle any clean up
mIntentsTestRule.getActivity().sharedPrefRepo.clearAll();
freeIdlingResources();
mIntentsTestRule.getActivity().finish();
}
私はスレッドを使用しない場合、エラーは以下の通りです:(旧Espresso.registerIdlingResources:
java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.RuntimeException: This method can not be called from the main application thread
at android.support.test.espresso.base.IdlingResourceRegistry.runSynchronouslyOnMainThread(IdlingResourceRegistry.java:314)
at android.support.test.espresso.base.IdlingResourceRegistry.sync(IdlingResourceRegistry.java:90)
at android.support.test.espresso.Espresso.onView(Espresso.java:69)
は注意してください、 )メソッドは、getInstance()。register()を介してIdlingRegistryによって非推奨になりました。
更新:ここに私のidlresourceコードは次のとおりです。
public class LoadingDialogIdlingResource implements IdlingResource {
private ResourceCallback resourceCallback;
private boolean isIdle;
@Override
public String getName() {
return LoadingDialogIdlingResource.class.getName();
}
@Override
public boolean isIdleNow() {
if (isIdle) return true;
Activity activity = getCurrentActivity();
if (activity == null) return false;
Fragment f = activity.getFragmentManager().findFragmentByTag(ProgressDialogFragment.class.getName());
isIdle = f == null;
if (isIdle) {
resourceCallback.onTransitionToIdle();
}
return isIdle;
}
public Activity getCurrentActivity() {
final Activity[] currentActivity = {null};
InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable(){
public void run(){
Collection<Activity> resumedActivity = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED);
Iterator<Activity> it = resumedActivity.iterator();
currentActivity[0] = it.next();
}
});
return currentActivity[0];
}
@Override
public void registerIdleTransitionCallback(
ResourceCallback resourceCallback) {
this.resourceCallback = resourceCallback;
}
}
残りのテストコードを表示できますか?このエラーはEspresson.onView()からのものであると思われます。問題はそのメソッドを呼び出す場所にある可能性が高いです。 – jdonmoyer
メインスレッドで実行されないアイドル状態のリソースが表示されている質問を更新しました。 – j2emanue