2016-12-15 1 views
0

には2つのViewsがあり、ネットワークの状態によって表示されます。ビューの可視性がなくなったときにエスプレッソNoMatchingViewExceptionをスローしない

LinearLayout recyclerView = (LinearLayout) findViewById(R.id.recycler_view); 
    LinearLayout errorParent = (LinearLayout) findViewById(R.id.error_parent); 

    if(Utils.isNetworkAvailable()){ 
     recyclerView.setVisibility(View.VISIBLE); 
     errorParent.setVisibility(View.GONE); 
    }else{ 
     recyclerView.setVisibility(View.GONE); 
     errorParent.setVisibility(View.VISIBLE); 
} 

私は、ネットワーク条件をテストするためのエスプレッソテストを作成しました。テストを実行する前に、私は手動でインターネットをオフにします。

ViewInteraction viewInteraction = onView(withId(R.id.recycler_view)); 
viewInteraction.check(matches(isDisplayed())); 

ないインターネットがないので、recycler_viewGONEであり、したがって、ビュー階層に存在しません。しかしコードを実行するときに私はNoMatchingViewExceptionを得ていません。理想的には、ビューが階層に存在しないときは、私は上記の例外を取得する必要があります。代わりに私はAssertionFailedErrorを得ています。

この動作の理由は何ですか?

答えて

2

ここでの最適な解決策は、ソースコードEspressoを調べることです。トレースしてみましょう、何が起こっている。

このlinecheck(final ViewAssertion viewAssert)をコールすると、ビューが階層内にあるかどうかが確認されます。 viewFinderが階層内のビューを検出するため、例外NoMatchingViewExceptionは捕捉されません。コードはassertionに行きます。だから、コードはViewAssertionの関数に冗談になります:matches(final Matcher<? super View> viewMatcher)missingViewExceptionはnullです。 この中でlinenoViewExceptionはヌルなので、コードはassertThatになります。アサーションはisDisplayed()で、これはglobal effective visibility of the viewです。これはAssertionFailedErrorがスローされた場所です。

ビューは、他の構成が使用されるべき現在のレイアウトに表示されていないwherther主張するために:私の意見では

onView({Matcher<View>}).check(doesNotExist()); 

または

onView({Matcher<View>}).check(matches(not(isDisplayed()))); 

それについての詳しい説明here

+0

詳細な回答ありがとうございます。私はあなたが言及したステップを通ってデバッグしました。明らかにEspressoはこの行の階層内のビューを見つけることができます。targetView = viewFinder.getView()。これはtargetViewをnull以外として返します。しかし、UIAutomatorを経由すると、階層にrecycler_viewが表示されません。理想的には、ここでも見解を得るべきではありません。 – thedarkpassenger

+0

ビューが階層に存在し、その後ビューの可視性がGONEに設定されている場合、EspressoはNoMatchingViewExceptionをスローしないと仮定します。 – thedarkpassenger

0

をこれは適切な振る舞いですか?ビューはビュー階層に存在し、表示されません。あなたは:

AssertionFailedWithCauseError: 'is displayed on the screen to the user' doesn't match the selected view. 
Expected: is displayed on the screen to the user 
+0

しかし、ビューの可視性をGONEに設定すると、アンドロイドはビューを階層から削除しません。 UIAutomatorでも、私はその見解を見つけることができません。 – thedarkpassenger

関連する問題