Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a way to test pickers with Robolectric?

I was following the tutorial from Android developer. Right now my class looks like this:

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());
    }

}

If I try to run a test like the following, I'm getting a NullPointerException on the first getDataPicker(). I want to check that the default date is today.

@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));
}

I would like to be able to test this class without using it inside an activity (in that case I believe I can use the buildActivity method and then ShadowDatePickerDialog but that's the next step).

So, is it possible to test the datePicker? I'm using robolectric 2.2

like image 330
dierre Avatar asked Oct 29 '13 14:10

dierre


1 Answers

It works with the new version Robolectric 3.X. You can try something like this:

    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());
like image 199
Javi Martínez Avatar answered Oct 09 '22 17:10

Javi Martínez