2015-11-23 22 views
6

初めてAndroidアプリケーションを開発していて、CIサーバを設定していました。私のエスプレッソテストは、私のマシンで問題なく動作しますが、次のエスプレッソを使用したエミュレータ画面のロック解除

java.lang.RuntimeExceptionとトラヴィス・エラーアウト:ウィンドウのフォーカスを持っているために、ビュー階層のルートを待っていたと10秒以上のレイアウトを要求されません。

テストを実行する前にエミュレータ画面のロックを解除する必要があるようです。私は必要な権限とsrc/debugにマニフェストを追加して画面のロックを解除する必要がそうするために:

KeyguardManager mKeyGuardManager = (KeyguardManager) ctx.getSystemService(Context.KEYGUARD_SERVICE); 
KeyguardManager.KeyguardLock mLock = mKeyGuardManager.newKeyguardLock(name); 
mLock.disableKeyguard(); 

事は、私はゴミにブロック場合に包まれた上記のコードで自分の活動をしたくないです。エスプレッソテスト自体から画面のロックを解除する方法はありますか?

マイエスプレッソテスト:

@RunWith(AndroidJUnit4.class) 
public class EspressoSetupTest { 

    @Rule 
    public final ActivityTestRule<WelcomeActivity> activity = 
      new ActivityTestRule<>(WelcomeActivity.class, true, true); 

    @Test 
    public void launchTest() { 
     onView(withId(R.id.welcome_textView_hello)) 
       .perform(click()) 
       .check(matches(withText("RetroLambda is working"))); 
    } 
} 

答えて

5

あなたは次のようにあなたのエスプレッソテストでsetUp()方法を使用することができます。私は

@UiThreadTest 
@Before 
public void setUp() throws Exception { 
    final Activity activity = mActivityRule.getActivity(); 
    mActivityRule.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      KeyguardManager mKG = (KeyguardManager) activity.getSystemService(Context.KEYGUARD_SERVICE); 
      KeyguardManager.KeyguardLock mLock = mKG.newKeyguardLock(KEYGUARD_SERVICE); 
      mLock.disableKeyguard(); 

     //turn the screen on 
     activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
        | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
        | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
        | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); 
      } 
     }); 
} 

のsrc /デバッグ/ AndroidManifest.xmlを

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" > 
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/> 
    <uses-permission android:name="android.permission.WAKE_LOCK"/> 
</manifest> 
+0

エスプレッソの設定が異なっている。私はコンテキストにアクセスすることができませんし、名前変数は何を保持する必要がありますか? –

+0

私はより明確にするために私の答えを編集しました。アクティビティを使用してシステムサービスを取得することができます。 name変数は単なるタグなので、この目的のために静的なKEYGUARD_SERVICE文字列を使用できます。 – woley

+0

ありがとう!私のエスプレッソのテストクラスは実際には何もサブクラス化していません。 ActivityTestRule.getActivity()を使用してアクティビティのインスタンスを取得していて、@Before setUp()メソッドにコードを入れても、動作しませんでした。 –

関連する問題