2017-01-20 6 views
2

テストを実行しようとする補助クラスDialogIdlingResourceがあります。このテスト以外はテストが行​​われます。ボタンを押すと、すべてが停止します。エスプレッソテストでタイムアウトしましたが、テストが実行されません

AcceptanceHelper.clickOnButtonInLayout(R.id.mainSignButton, R.string.common_signin_button_text, R.id.inputLayout) 

コードは、2つのヘルパー・メソッドとスニペット:

@Test 
fun signInUserWithInvalidEmail() { 
    goToSignIn() 
    AcceptanceHelper.updateValidationTextView(R.string.ui_data_attribute_email, "[email protected]") 
    AcceptanceHelper.updateValidationTextView(R.string.ui_data_attribute_password, VALID_PASSWORD) 
    AcceptanceHelper.clickOnButtonInLayout(R.id.mainSignButton, R.string.common_signin_button_text, R.id.inputLayout) 
    val idlingResource = DialogIdlingResource() 
    registerDialogIdlingResource() 
    unregisterDialogIdlingResource() 
} 
    private fun registerDialogIdlingResource() { 
    val instrumentation = InstrumentationRegistry.getInstrumentation() 
    idlingResource = DialogIdlingResource() 
    Espresso.registerIdlingResources(idlingResource) 
} 


private fun unregisterDialogIdlingResource() { 
    Espresso.unregisterIdlingResources(idlingResource) 
} 

考え、そのエラーに起因regesterと登録解除の二つの方法(idlingResource)へ

しかし、実際にはそれが動作するはずですが、かもしれませんおそらく間違いを犯したかもしれない補助クラスコード:

class DialogIdlingResource(private val waitTimeSeconds: Int = 5) : 

IdlingResource { 
private var resourceCallback: IdlingResource.ResourceCallback? = null 
private var startTime = -1L 

override fun getName(): String { 
    return DialogIdlingResource::class.java.name 
} 

override fun isIdleNow(): Boolean { 
    if (startTime < 0) { 
     startTime = System.currentTimeMillis() 
    } 
    val timeOut = System.currentTimeMillis() - waitTimeSeconds * 1000 > startTime 
    if (timeOut) 
     throw TimeoutException("error") 
    val idle = !isDialogRunning 
    if (idle && resourceCallback != null) { 
     resourceCallback!!.onTransitionToIdle() 
    } 
    return idle 
} 

override fun registerIdleTransitionCallback(resourceCallback: IdlingResource.ResourceCallback) { 
    this.resourceCallback = resourceCallback 
} 

private val isDialogRunning: Boolean 
    get() { 
     try { 
      onView(Matchers.allOf(withId(R.id.titleTextView), ViewMatchers.withText("Warning"))) 
        .check(ViewAssertions.matches(isDisplayed())) 
     } catch (e: NoMatchingViewException) { 
      e.printStackTrace() 
      System.out.println("some text") 
     } 
     return true 
    } 

また問題を次のsolutionと解決しようとします。私のテストのうちの1つだけを実行すると、すべての作品が良好です。しかし、私はすべてのテストを開始すると、私はエラーをキャッチします。 Beacauseテストでは、ダイアログ内のテキストを確認する時間が無かったので、ダイアログを開いただけです。

IdlingResourceクラス:

私のテストで
class ElapsedTimeIdlingResource(private val activity: SignActivity?) : IdlingResource { 
private var callback: IdlingResource.ResourceCallback? = null 

override fun getName(): String { 
    return "SignInScreenTest" 
} 

override fun isIdleNow(): Boolean { 
    val idle = isIdle 
    if (idle) callback!!.onTransitionToIdle() 
    return idle 
} 

val isIdle: Boolean 
    get() = activity != null && callback != null 

override fun registerIdleTransitionCallback(resourceCallback: IdlingResource.ResourceCallback) { 
    this.callback = resourceCallback 
} 

}

val activity = mActivityTestRule.getActivity() 
    val idlingResource = ElapsedTimeIdlingResource(activity) 
    Espresso.registerIdlingResources(idlingResource) 
    AcceptanceHelper.checkTextView(R.id.titleTextView, "Warning") 

と私は繰り返し、私はすべての私のテストを開始したときだけ、私はregisterIdlingResourcesとchecktextView間睡眠を配置する必要があります 次のようになります。

SystemClock.sleep(5000) 

この問題の解決にお役立てください。そして私の英語には申し訳ありません。

答えて

1

申し訳ありませんが、IdlingResourceは超複雑な待機機能のようです。

このコードスニペットは私にとって役に立ちます - github link。 ViewVisibilityIdlingResourceコンストラクタに必要なパラメータを提供するだけです。そのうちの1つはint viewIdで、もう1つはint visibilityです。たとえば、viewIdをダイアログレイアウト内から提供し、可視性がView.GONEの場合、このリソースは、ビューが表示されるまで、またはダイアログがユーザーに表示されるまで、Espressoテストをブロックします。

+0

'のjava.lang.NullPointerException:nullオブジェクトreference'上の仮想メソッドを呼び出すための試み 'int型android.view.View.getId()' 私はこの' valのような何かを解決するときidlingResource = ViewVisibilityIdlingResource(mActivityTestRule.activity.findViewById(R.id.titleTextView)、2000) ' – Inkognito

+0

あなたが探しているビューはおそらく異なる活動に属し、その後は' mActivityTestRule.activity'です。最新のアクティビティを画面に表示する必要があります。このリンクを参照してください - http://qathread.blogspot.ch/2014/09/discovering-espresso-for-android-how-to.html – denys

0

しかし、kotlinの構文をキャッチしませんでした。

isIdle()は、メインスレッドで常に実行され、非ブロックにする必要があります。だから、isIdle()でisDialogRunning()を呼び出すのではなく、別のスレッドで を呼び出し、isIdle()によってチェックできるidlingResourceの状態を更新します(ビューの一致またはタイムアウトの場合)。

はそれが役に立てば幸い:)

関連する問題