2013-03-25 3 views
1

У меня есть приложение с несколькими действиями со списками, выбор из первого списка отображает содержимое второго списка, а второй вид списка определяет содержимое третьего и т. Д.Использование Robotium с намерениями

Я хочу проверить третий вид списка, но поскольку он требует намерения, список ничего не возвращает. Чтобы решить эту проблему, я могу вручную добавить намерение к испытанию, которое не означает, что работает

public InspectionListActivityTest() { 
    super(InspectionListActivity.class); 
    Intent i = new Intent(); 
    i.putExtra("guid", "abcbbf2b-5e14-4cb1-af1b-e3084b45d4cf"); 
    setActivityIntent(i); 
} 

Как вы можете видеть из кода, он использует идентификаторы GUID, чтобы определить список, который является то, что я хочу, чтобы избежать - я очистить базы данных, пока я тестирую, поэтому я должен постоянно менять это поле.

В идеале я хочу использовать ContentResolver, чтобы получить первый Guid из другой таблицы, которая будет означать, я смог бы всегда тянуть обратно информацию в моих тестах, т.е.

public InspectionListActivityTest() { 
    super(InspectionListActivity.class); 

    ContentResolver cr = getActivity().getContentResolver(); 
    Cursor cursor = cr.query(Locations.CONTENT_URI, null, null, null, null); 
    if (cursor != null) { 
     if (cursor.moveToFirst()) { 
      String guid = cursor.getString(cursor.getColumnIndex(Locations.GUID)); 
      Intent i = new Intent(); 
      i.putExtra(IntentFilters.LOCATION.getIntent(), guid); 
      setActivityIntent(i); 
     } 
    } 
} 

Однако, я получаю NullPointerException по методу getActivity(), и я, похоже, не могу помещать этот setActivityIntent нигде.

ответ

0

Это можно сделать, но это немного грязно. В основном получил руководство от базы данных, которую я хотел, создал новое намерение для исходного тестового класса, приложил руководство к намерению, а затем начал свое намерение.

public void setUp() throws Exception { 
    super.setUp(); 

    solo = new Solo(getInstrumentation(), getActivity()); 

    activity = getActivity(); 

    UsefulFunctions.insertDummyData(getActivity()); 

    ContentResolver cr = getActivity().getContentResolver(); 
    Cursor cursor = cr.query(Locations.CONTENT_URI, null, null, null, null); 

    if (cursor != null) { 
     if (cursor.moveToFirst()) { 
      guid = cursor.getString(cursor.getColumnIndex(Locations.GUID)); 

     } 
    } 

    solo.goBack(); 

    Intent i = new Intent(activity.getApplicationContext(), InspectionListActivity.class); 
    i.putExtra(IntentFilters.LOCATION.getIntent(), guid); 
    setActivityIntent(i); 
    activity.startActivity(i); 


} 

В некотором смысле, это было просто легче начать на моем первом списке, а затем получить Robotium до щелчка в списке все пути к экрану, что я хотел, т.е.

solo.clickInList(0); 

// Locations 
solo.clickInList(0); 

ListView ls = solo.getCurrentListViews().get(0); 

solo.waitForActivity("InspectionListActivity"); 
0

Это все должно быть сделано в методе setup() вашего теста, а не в его конструкторе. Конструкторы тестов бесполезны и должны оставаться неизмененными.

+0

Спасибо , теперь проблема только в том, что если я переведу все это в setup(), тогда намерение активности должно быть установлено ПЕРЕД первым вызовом getActivity() (см. http://developer.android.com/reference/android/test/ActivityInstrumentationTestCase2. html # setActivityIntent (android.content.Intent)), но мне нужно getActivity(), чтобы получить ContentResolver, если нет другого пути ...? –

+0

Вы можете использовать http://developer.android.com/reference/android/test/ActivityInstrumentationTestCase2.html#setActivityIntent(android.content.Intent) – Snicolas

Смежные вопросы