Подтвердить что ты не робот

Как написать тест андроида JUnit, когда моя деятельность зависит от дополнительных функций, переданных через Intent?

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

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", "[email protected]");
  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 Exception в строке:

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

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


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

@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. Является ли мой синтаксис неправильным? Любые предложения?

4b9b3361

Ответ 1

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

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

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

Вызвать этот метод перед первым вызовом для getActivity() для инъекции индивидуальное намерение в действие под испытанием.

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

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

Ответ 2

Хорошо, я понял свою ошибку! Код для 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(), и первый вызов был впереди Intent. Используя правильный порядок, тест проходит нормально. Спасибо за помощь McStretch.