Как мне написать тест JUnit для Android, когда моя деятельность основана на дополнениях, переданных через Intent? - PullRequest
18 голосов
/ 01 декабря 2010

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

public class AddClassEvent extends Activity{
 private String eventType;

  @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  Bundle extras = getIntent().getExtras();
  final String cNo = extras.getString("CourseNum");

  // create a model instance
  final StudentDBModel model = new StudentDBModel(this);

  setContentView(R.layout.add_class_event);
 .....
 .....
         }
     }

Тестовый класс выглядит как ...

public class AddClassEventTest extends ActivityInstrumentationTestCase2<AddClassEvent>{
 private StudentDBModel model = null;
 private RenamingDelegatingContext context = null;

 public AddClassEventTest() {
  super("com.UI", AddClassEvent.class);
 }

 /**
  * This method is called before each test.
  */
 @Override
 public void setUp() {
  context = new RenamingDelegatingContext(getActivity(), "test_");
  model = new StudentDBModel(context);
 }

 /*
  * This function will test addNewClassEvent() from StudentDBModel
  */
 public void testAddNewClassEvent(){

  ContentValues courseValues = new ContentValues();
  courseValues.put("CourseId", "60-415");
  courseValues.put("CourseName", "Advanced Database Design");
  courseValues.put("Section", "1");
  courseValues.put("Location", "Erie");
  courseValues.put("Credit", "3");
  courseValues.put("ProfEmail", "rfortier@uwindsor.ca");
  courseValues.put("Website", "cs.uwindsor.ca");

  model.addNewCourses(courseValues);

  int numEventsBefore = model.getNumClassEvents();

  ContentValues values = new ContentValues();

  values.put("EventName", "Assignment 1");
  values.put("CourseId", "60-415");
  values.put("EventType", "Assignment");
  values.put("EventWeight", "8");
  values.put("DueDate", "10/20/2010");

  model.addNewClassEvent(values);

  int numEventsAfter = model.getNumClassEvents();

  assertEquals(numEventsBefore + 1, numEventsAfter);
 }
}

Проблема в том, что дополнительно, которое я передаю классу AddClassEvent, это PK для моей БД, который создается в другом классе и передается в AddClassEvent через Intent. Всякий раз, когда я запускаю тест, я получаю исключение NULL Pointer в строке:

final String cNo = extras.getString("CourseNum");

Как мне создать информацию из дополнения в тесте Junit? Есть ли способ заставить этот тест работать? Я много искал и не могу найти ответ. Есть ли какой-нибудь способ ложного создания дополнений в тесте Junit, чтобы он думал, что он создается другим классом? Если да, может кто-нибудь показать, пожалуйста, как?


ОК, поэтому я попытался воспользоваться вашим советом и изменил мою функцию настройки на:

@Override
public void setUp() {
    context = new RenamingDelegatingContext(getActivity(), "test_");
    model = new StudentDBModel(context);
    Intent addEvent = new Intent();
    addEvent.setClassName("com.UI", "com.UI.AddClassEvent");
    addEvent.putExtra("CourseNum", "60-415");
    setActivityIntent(addEvent);
    getActivity();
}

но я все еще получаю исключение NULL Pointer. Мой синтаксис неправильный? Есть предложения?

Ответы [ 2 ]

18 голосов
/ 01 декабря 2010

Класс, который вы наследуете, ActivityInstrumentationTestCase2, позволяет вам высмеивать Intent s.Из документации :

Вы можете добавить пользовательские Интенты в свою деятельность (см. SetActivityIntent (Intent)).

Документация для setActivityIntent () дополнительно разъясняет:

Вызовите этот метод перед первым вызовом getActivity (), чтобы добавить настроенное намерение в тестируемое действие.

Если вы этого не сделаетевызовите это, намерение по умолчанию будет обеспечено.Если вы вызовете это после того, как ваша активность была начата, это не будет иметь никакого эффекта.

Таким образом, вы должны иметь возможность сделать вызов этого метода внутри вашего setUp() до вызова getActivity(),Вы можете передать поддельное намерение в setActivityIntent, как вы упомянули - просто создайте поддельное намерение с дополнительными компонентами, которые, как вы ожидаете, увидит активность.

12 голосов
/ 02 декабря 2010

ОК, я понял свою ошибку! Код для setUp был просто в неправильном порядке. Это должно выглядеть так:

@Override
public void setUp() {
    Intent addEvent = new Intent();
    addEvent.setClassName("com.UI", "com.UI.AddClassEvent");
    addEvent.putExtra("CourseNum", "60-415");
    setActivityIntent(addEvent);
    context = new RenamingDelegatingContext(getActivity(), "test_");
    model = new StudentDBModel(context);
}

Я дважды вызывал getActivity (), и первый вызов был перед намерением. Используя правильный порядок, тест выполняется нормально. Спасибо за помощь McStretch.

...