私はonView(withId(R.id.check_box)).perform(click())
を持っていますが、チェックボックスがまだオンになっていない場合にのみ、これを実行します。エスプレッソでこれを行うにはどうすればよいですか?
また、以前の状態に応じてチェックボックス/スイッチを切り替えたいと思っていました。最初に、私はこれをオフにしていたチェックボックスをオンに切り替えようとしました:
onView(withId(R.id.checkbox)).check(matches(isNotChecked())).perform(scrollTo(), click());
...そしてこれは、オンになっていたチェックボックスをオフに切り替えるには:
onView(withId(R.id.checkbox)).check(matches(isChecked())).perform(scrollTo(), click());
ただし、Espressoはアクションを実行する前に特定のトグル状態を探しているため、これは機能しません。事前にONかOFFかわからない場合があります。
私の解決策は、カスタムViewActionを使用して、以前の状態に依存しないチェック可能なオブジェクト(スイッチ、チェックボックスなど)をオフ/オンにすることです。したがって、すでにオンになっている場合は、オンのままになります。オフの場合、オンに切り替わります。ここにViewActionがあります:
public static ViewAction setChecked(final boolean checked) {
return new ViewAction() {
@Override
public BaseMatcher<View> getConstraints() {
return new BaseMatcher<View>() {
@Override
public boolean matches(Object item) {
return isA(Checkable.class).matches(item);
}
@Override
public void describeMismatch(Object item, Description mismatchDescription) {}
@Override
public void describeTo(Description description) {}
};
}
@Override
public String getDescription() {
return null;
}
@Override
public void perform(UiController uiController, View view) {
Checkable checkableView = (Checkable) view;
checkableView.setChecked(checked);
}
};
}
そして、これを使用する方法は次のとおりです(この例では、ONに切り替えたい場合):
onView(withId(R.id.toggle)).perform(scrollTo(), setChecked(true));
同じ問題があり、SwitchCompatを常にオフにする独自のViewActionを作成しました
class UncheckViewAction implements ViewAction{
@Override
public Matcher<View> getConstraints() {
return new Matcher<View>() {
@Override
public boolean matches(Object item) {
return isA(SwitchCompat.class).matches(item);
}
@Override
public void describeMismatch(Object item, Description mismatchDescription) {
}
@Override
public void _dont_implement_Matcher___instead_extend_BaseMatcher_() {
}
@Override
public void describeTo(Description description) {
}
};
}
@Override
public String getDescription() {
return null;
}
@Override
public void perform(UiController uiController, View view) {
SwitchCompat scView = (SwitchCompat) view;
scView.setChecked(false);
}
}
次のように使用しました:
onView(withId(R.id.check_box)).perform(new UncheckViewAction())
これで、以前にチェックしたかどうかに関係なく、見つかったスイッチが常にオフになっていることを確認できます。
あなたのコードには次のようなものがあります:
@Rule
public ActivityTestRule<ActivityMain> ActivityMainRule = new ActivityTestRule<>(ActivityMain.class);
試す
if (!ActivityMainRule.getActivity().findViewById(R.id.check_box).isChecked()) {
onView(withId(R.id.check_box)).perform(click())
}
これはテストの一部のようです。チェックボックスをオンにする必要があります。
これは次の方法で確認できます。
onView(withId(R.id.checkbox)).check(matches(not(isChecked())));
これが失敗すると、テストは失敗します。次に、このケースが一致した後、必要なクリックを実行できます。
これがあなたが望む状況ではない場合、このエスプレッソテストで何をしようとしているのかもっと説明できますか?
@FrostRocketと同じようにKotlinで記述されています。
チェック可能な項目に対してのみ実行できるカスタムアクションを定義します(制約で指定されているとおり)。したがって、ビューをCheckableに安全にキャストして、setCheckableメソッドにアクセスします。
fun setChecked(checked: Boolean) = object : ViewAction {
val checkableViewMatcher = object : BaseMatcher<View>() {
override fun matches(item: Any?): Boolean = isA(Checkable::class.Java).matches(item)
override fun describeTo(description: Description?) {
description?.appendText("is Checkable instance ")
}
}
override fun getConstraints(): BaseMatcher<View> = checkableViewMatcher
override fun getDescription(): String? = null
override fun perform(uiController: UiController?, view: View) {
val checkableView: Checkable = view as Checkable
checkableView.isChecked = checked
}
}