有没有一种方法可以使用Robolectric来测试选择器?

6

我正在按照Android开发者的教程学习。现在我的课程看起来像这样:

public class DatePickerFragment extends DialogFragment implements
        DatePickerDialog.OnDateSetListener {

    final Calendar calendar = Calendar.getInstance();

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new DatePickerDialog(getActivity(), this,
                calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
                calendar.get(Calendar.DAY_OF_MONTH));
    }

    @Override
    public void onDateSet(DatePicker view, int year, int month, int day) {
        calendar.set(year, month, day);
        Datable datable = (Datable) view.getContext();
        datable.setDate(calendar.getTime());
    }

}

如果我尝试运行以下测试,第一个getDataPicker()会引发NullPointerException异常。我想要检查默认日期是否为今天。

@Test
public void testDatePickerFragment() {
    final Calendar calendar = Calendar.getInstance();
    int expectedYear = calendar.get(Calendar.YEAR);
    int expectedMonth = calendar.get(Calendar.MONTH);
    int expectedDay = calendar.get(Calendar.DAY_OF_MONTH);

    DatePickerFragment fragment = new DatePickerFragment();

    FragmentActivity activity = Robolectric
            .buildActivity(FragmentActivity.class).create().start()
            .resume().get();

    FragmentManager fragmentManager = activity.getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager
            .beginTransaction();
    fragment.show(fragmentManager, "datePicker");
    fragmentTransaction.commit();

    DatePickerDialog dialog = (DatePickerDialog) ShadowDatePickerDialog
            .getLatestDialog();

    assertThat(dialog, is(not(nullValue())));

    assertThat(dialog.getDatePicker().getDayOfMonth(), is(expectedDay));
    assertThat(dialog.getDatePicker().getMonth(), is(expectedMonth));
    assertThat(dialog.getDatePicker().getYear(), is(expectedYear));
}

我希望能够在不使用活动的情况下测试这个类(在这种情况下,我相信我可以使用buildActivity方法然后使用ShadowDatePickerDialog,但那是下一步)。

那么,能否测试日期选择器?我正在使用robolectric 2.2。


我认为这是Robolectric中的一个问题,如果我能找到一些时间来解决它,它就在我的待办列表上。 - Corey D
目前来看,首先构建一个活动是解决这个空指针问题的正确方法吗? - dierre
我的意思是在我想嵌入日期选择器的实际活动中,因此启动一个带有布局的FragmentActivity。 - dierre
这个问题有任何更新吗?我使用FragmentTestUtil.startFragment也遇到了同样的问题。在构造后,DatePickerDialog.mDatePicker仍然为空。 - DDD
这看起来像是一个重复的问题,原地址为http://stackoverflow.com/questions/16652414/。 - DDD
1个回答

4
它与新版本的Robolectric 3.X兼容。您可以尝试像这样的内容:
    startDate.performClick();
    DatePickerDialog dialog = (DatePickerDialog) ShadowDatePickerDialog.getLatestDialog();
    dialog.updateDate(2013, 10, 23);
    dialog.getButton(DatePickerDialog.BUTTON_POSITIVE).performClick();
    assertEquals("2013-11-23", startDate.getText().toString());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接