当我的活动依赖于通过Intent传递的额外内容时,如何编写android JUnit测试?

Ste*_*all 18 junit android extras android-intent

我正在为一个依赖于通过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);
 .....
 .....
         }
     }
Run Code Online (Sandbox Code Playgroud)

测试类看起来像......

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);
 }
}
Run Code Online (Sandbox Code Playgroud)

问题是,我传递给AddClassEvent类的额外内容是我的DB的PK,它在另一个类中创建并通过Intent传递给AddClassEvent.每当我运行测试时,我都会在线上获得NULL指针异常:

final String cNo = extras.getString("CourseNum");
Run Code Online (Sandbox Code Playgroud)

如何在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();
}
Run Code Online (Sandbox Code Playgroud)

但我仍然得到一个NULL指针异常.我的语法错了吗?有什么建议?

McS*_*tch 18

您继承的类ActivityInstrumentationTestCase2允许您模拟Intent.从文档:

您可以将自定义Intent注入Activity(请参阅setActivityIntent(Intent)).

setActivityIntent()的文档进一步阐明:

在第一次调用getActivity()之前调用此方法,以将自定义Intent注入到测试中的Activity中.

如果您不调用此方法,则会提供默认意图.如果在Activity启动后调用此方法,则无效.

因此,您应该能够在通话setUp()前打电话给这个方法getActivity().你可以像你提到的那样将一个模拟的Intent传递给setActivityIntent - 只需构建一个假的Intent,其中包含你期望Activity看到的额外内容.


Ste*_*all 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);
}
Run Code Online (Sandbox Code Playgroud)

我两次调用getActivity(),第一次调用是在Intent之前.通过使用正确的顺序,测试运行正常.感谢McStretch的帮助.

  • 请将您的答案或我的答案标记为已接受,以便关闭该问题. (3认同)