19

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 に渡すエクストラが、別のクラスで作成され、Intent を介して AddClassEvent に渡される DB の PK であることです。テストを実行するたびに、次の行で 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 ポインター例外が発生しています。私の構文は間違っていますか?助言がありますか?

4

2 に答える 2

18

The class you inherit, ActivityInstrumentationTestCase2, allows you to mock Intents. From the documentation:

You can inject custom Intents into your Activity (see setActivityIntent(Intent)).

The documentation for setActivityIntent() further clarifies:

Call this method before the first call to getActivity() to inject a customized Intent into the Activity under test.

If you do not call this, the default intent will be provided. If you call this after your Activity has been started, it will have no effect.

So you should be able to place a call to this method inside your setUp() before your call to getActivity(). You can pass in a mocked Intent into setActivityIntent like you mentioned -- just build a fake Intent with extras that you'd expect the Activity to see.

于 2010-12-01T13:25:10.837 に答える
12

OK、私は自分の間違いを理解しました! 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() を 2 回呼び出していましたが、最初の呼び出しはインテントよりも先でした。正しい順序を使用すると、テストは正常に実行されます。助けてくれてありがとう

于 2010-12-01T22:26:55.737 に答える