0

私はこれをさまざまな方法で見てきましたが、私が残したわずかな髪で、誰かがすでにこれを試したことを願ってそこに出すと思いました.

Roboguice 対応アクティビティの Robolectric テストを作成しようとしています。具体的には、RadioGroup の動作を保証するテストを作成しようとしています。

問題は、テストの実行時に、RadioGroup が RadioGroup のように動作せず、一度に 1 つの RadioButton をチェックするという動作を強制することです。グループ内の 3 つのボタンすべてを一度にチェックできることは、Asserting とデバッガーの両方で確認できます。

RadioGroup は非常に単純です。

<RadioGroup
    android:id="@+id/whenSelection"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <RadioButton
        android:id="@+id/whenToday"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="true"
        android:text="@string/today" />

    <RadioButton
        android:id="@+id/whenYesterday"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/yesterday" />

    <RadioButton
        android:id="@+id/whenOther"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/earlier" />

</RadioGroup>

次に、アプリを実行するものを指摘する必要があります。動作は私が期待するものです(ラジオボタンのいずれかをクリックすると、その1つだけがチェックされたままになり、他の2つはチェックされません)。したがって、理論的には、このテストに合格する必要があります。

    -- snip--
    Assert.assertTrue(whenToday.isChecked());
    Assert.assertFalse(whenYesterday.isChecked());
    Assert.assertFalse(whenOther.isChecked());

    whenYesterday.performClick();

    Assert.assertTrue(whenYesterday.isChecked());
    Assert.assertFalse(whenToday.isChecked());
    -- snip --

しかし、何が起こるかというと、最後のアサーションが失敗し、デバッガーは whenToday の最初のボタンがチェックされたままになっていることを確認します。

完全なテストクラスは次のとおりです。

@RunWith(InjectedTestRunner.class)
public class MyTest {
    @Inject ActivityLogEdit activity;

    RadioButton whenToday;
    RadioButton whenYesterday;
    RadioButton whenOther;

@Before
public void setUp() {
    activity.setIntent(new Intent());
    activity.onCreate(null);

    whenSelection = (RadioGroup) activity.findViewById(R.id.whenSelection);
    whenToday = (RadioButton) activity.findViewById(R.id.whenToday);
    whenYesterday = (RadioButton) activity.findViewById(R.id.whenYesterday);
    whenOther = (RadioButton) activity.findViewById(R.id.whenOther);       
}

@Test
public void checkDateSelectionInitialState() throws Exception {
    Assert.assertTrue(whenToday.isChecked());
    Assert.assertFalse(whenYesterday.isChecked());
    Assert.assertFalse(whenOther.isChecked());
    Assert.assertEquals(View.GONE, logDatePicker.getVisibility());

    whenYesterday.performClick();

    Assert.assertTrue(whenYesterday.isChecked());
    Assert.assertFalse(whenToday.isChecked());
  }
}

私はこれを私が考えることができるあらゆる方法で試しました。何かばかげたことをしている、または基本的な概念が欠けているような気がします。助けてください!

アンドリュー

4

1 に答える 1

1

Robolectric Group の開発者の 1 人から、Robolectric Group に関する投稿への回答を受け取りました。

あなたが話している機能(ラジオボタンをチェックすると、グループ内の他のすべてのラジオボタンのチェックが解除されます)は、Robolectric にはまだ実装されていません。自由に機能リクエストを提出してください: https://github.com/pivotal/robolectric/issues/ 私の記憶が正しければ、RadioButtons の isChecked() の代わりに RadioGroup で getCheckedRadioButtonId() を使用するようにテストを変更してみてください。実装されていると信じています。

私も試しgetCheckedRadioButtonId()てみましたが、実装されていないことに注意してください(常に-1を返します)。

アンドリュー

于 2012-04-09T00:22:54.727 に答える