を使用して Android アプリをテストしていJUnit
ます。実際にテストを行うのは初めてJUnit
なので、進むべき道がわかりません。現在、連絡先リストへのクエリをテストしています。多くのメソッドはパラメータとして aRaw Contact ID
または aのみを必要とし、Contact ID
それらのほとんどは a または を返します。JSON Object
JSON Array
ArrayList
私の質問は、期待される結果と実際の結果をどのように比較すればよいですか?
現在、私は次のようにそれらをテストしています:
public void testGetRelationship() {
JSONArray jsonArrayActual = new JSONArray();
JSONArray jsonArrayExpected = new JSONArray();
try {
jsonArrayExpected = contact.getRelationship(RAW_CONTACT_ID);
} catch (JSONException e) {
e.printStackTrace();
fail("Failed when calling the getRelationship method. " + e.getMessage());
}
Cursor cursor = getContext().getContentResolver().query(Data.CONTENT_URI,
new String[]{Relation.NAME, Relation.TYPE, Relation._ID, Relation.LABEL},
Relation.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?",
new String[]{RAW_CONTACT_ID, Relation.CONTENT_ITEM_TYPE},
null);
if(cursor.moveToFirst())
{
do{
try {
final JSONObject jsonRelationshipObject = new JSONObject();
final String name = cursor.getString(0);
final Integer type = cursor.getInt(1);
final Integer id = cursor.getInt(2);
final String label = cursor.getString(3);
jsonRelationshipObject.put("id", id);
jsonRelationshipObject.put("type", type);
jsonRelationshipObject.put("label", label);
jsonRelationshipObject.put("name", name);
jsonArrayActual.put(jsonRelationshipObject);
} catch (JSONException e) {
e.printStackTrace();
fail("Failed while adding the values to the JSONObject. " + e.getMessage());
}
} while(cursor.moveToNext());
}
else
{
cursor.close();
fail("RawContact not found! ID: " + RAW_CONTACT_ID);
}
cursor.close();
try {
JSONAssert.assertEquals(jsonArrayExpected, jsonArrayActual, true);
} catch (JSONException e) {
e.printStackTrace();
cursor.close();
fail("JSONAssert exception: " + e.getMessage());
}
}
基本的に、私は実際のメソッドを呼び出して、(テスト中の) メソッドをほとんど再コーディングしています。これは非生産的であるか、少なくとも非常に退屈で退屈だと思います (先ほどコーディングしたものをもう一度コーディングします)。JUnit
テストを実行するためのより良い方法があると確信しています。連絡先リストのデータベースにクエリを実行し、比較するオブジェクトを手動で作成することを考えました。次のようにします。
public void testGetRelationship() {
JSONArray jsonArrayActual = new JSONArray();
JSONArray jsonArrayExpected = new JSONArray();
try {
jsonArrayExpected = contact.getRelationship(RAW_CONTACT_ID);
} catch (JSONException e) {
e.printStackTrace();
fail("Failed when calling the getRelationship method. " + e.getMessage());
}
jsonRelationshipObject.put("id", 6);
jsonRelationshipObject.put("type", 1);
jsonRelationshipObject.put("label", "A label");
jsonRelationshipObject.put("name", "the name");
jsonArrayActual.put(jsonRelationshipObject);
try {
JSONAssert.assertEquals(jsonArrayExpected, jsonArrayActual, true);
} catch (JSONException e) {
e.printStackTrace();
cursor.close();
fail("JSONAssert exception: " + e.getMessage());
}
}
コーディングする方が高速ですが、電話からデータベースを手動でダウンロードする必要があり (私にとっては大したことではありません)、そこにデータを取得するために手動でクエリを実行する必要があります (大したことではありません) が、そうではありません非常に一般的であるため、データベースが変更された場合、すべてのテストが失敗すると思います。しかし、データベースのスナップショットを取得して保存し、そのスナップショットに対して常にテストを実行できます。
助言がありますか?改善?