2010-12-01 2 views
18

Я пишу андроидский тест Юнита для класса, который опирается на дополнения, переданные ему через намерение. Я смог заставить класс работать нормально, но мне все равно хотелось бы знать, как написать единичный тест для такого класса, поскольку тест все еще не работает.Как написать тест андроида 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", "[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 является ПК для моей БД, которая создается в другом классе и прошел к AddClassEvent через намерение. Всякий раз, когда я запускаю тест я получаю исключение NULL указателя на на линии:

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

+1

Когда вы используете putExtra(), вам нужно включить префикс пакета с именем. Пример: addEvent.putExtra («com.ui.CourseNum», «60-415»); – McStretch 2010-12-01 20:50:51

ответ

18

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

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

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

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

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

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

+0

ОК, спасибо за ответ. Я попробую это и опубликую свои результаты. – 2010-12-01 18:57:34

+1

Я пробовал ваш совет, но все равно получаю исключение Null Pointer. Я добавил код для моих изменений в мою функцию setUp выше. – 2010-12-01 20:42:02

12

ОК, я понял свою ошибку! Код для 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.

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

  • Нет связанных вопросов^_^