我正在为一个依赖于通过Intent传递给它的额外内容的类编写一个Android Junit测试。我能够让课程正常工作,但我仍然想知道如何为这样的课程编写单元测试,因为测试仍然失败。
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类的额外内容是我的DB的PK,它在另一个类中创建并通过Intent传递给AddClassEvent。每当我运行测试时,我都会在行上获得NULL指针异常:
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指针异常。我的语法错了吗?有什么建议吗?
答案 0 :(得分:18)
您继承的课程ActivityInstrumentationTestCase2
允许您模拟Intent
。来自documentation:
您可以将自定义Intent注入您的Activity(请参阅setActivityIntent(Intent))。
setActivityIntent()的文档进一步阐明:
在第一次通话前调用此方法 getActivity()注入一个 定制Intent进入Activity 正在测试中。
如果你不打电话,默认 将提供意图。如果你打电话 在您的活动结束后 开始,它将没有任何效果。
因此,在致电setUp()
之前,您应该可以在getActivity()
内拨打此方法。你可以像你提到的那样将一个模拟的Intent传递给setActivityIntent - 只需构建一个假的Intent,其中包含你期望Activity看到的额外内容。
答案 1 :(得分:12)
@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的帮助。