ProviderTestCase
और RenamingDelegatingContext
दोनों डेटाबेस को नष्ट कर देंगे यदि कोई पहले से ही इसके संदर्भ में इसे खोलने से पहले मौजूद है, तो इस अर्थ में वे दोनों SQLite डेटाबेस खोलने की दिशा में एक ही निम्न-स्तरीय दृष्टिकोण रखते हैं।
आप setUp()
में अपने स्थिरता में डेटाबेस खोलकर इसका लाभ उठाते हैं, जिससे यह सुनिश्चित होगा कि आप प्रत्येक परीक्षण मामले से पहले एक नए डेटाबेस के साथ काम कर रहे हों।
मैं सुझाव दूंगा कि आप डेटाबेस एडाप्टर बनाने के बजाय सामग्री प्रदाताओं को लिखने के लिए जाएं। आप डेटा तक पहुंचने के लिए एक सामान्य इंटरफ़ेस का उपयोग कर सकते हैं, इसे डीबी में या नेटवर्क पर कहीं भी संग्रहीत किया जा सकता है, सामग्री प्रदाताओं के डिज़ाइन को आईपीसी ओवरहेड की लागत पर ऐसे डेटा तक पहुंचने के लिए समायोजित किया जा सकता है जिसमें से अधिकांश को ' टी के बारे में परवाह है।
यदि आपने SQLite डेटाबेस तक पहुंचने के लिए ऐसा किया है, तो फ्रेमवर्क एक अलग प्रक्रिया में आपके लिए डेटाबेस कनेक्शन को पूरी तरह से प्रबंधित करेगा। जोड़ा गया गोमांस के रूप में, ProviderTestCase2<ContentProvider>
कोड के एक पंक्ति को लिखने के बिना आपके सामग्री प्रदाता के लिए पूरी तरह से बूट संदर्भ को बूटस्ट्रैप्स करता है।
लेकिन, ऐसा नहीं कहा जाता है कि बूटस्ट्रैपिंग करने के लिए यह इतना बड़ा प्रयास नहीं है। तो मान लीजिए कि आपके पास डेटाबेस एडाप्टर था;
public class MyAdapter {
private static final String DATABASE_NAME = "my.db";
private static final String DATABASE_TABLE = "table";
private static final int DATABASE_VERSION = 1;
/**
* Database queries
*/
private static final String DATABASE_CREATE_STATEMENT = "some awesome create statement";
private final Context mCtx;
private SQLiteDatabase mDb;
private DatabaseHelper mDbHelper;
private static class DatabaseHelper extends SQLiteOpenHelper {
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE_STATEMENT);
}
@Override
public void onUpgrade(SQLiteDatabase db, int a, int b) {
// here to enable this code to compile
}
}
/**
* Constructor - takes the provided context to allow for the database to be
* opened/created.
*
* @param context the Context within which to work.
*/
public MyAdapter(Context context) {
mCtx = context;
}
/**
* Open the last.fm database. If it cannot be opened, try to create a new
* instance of the database. If it cannot be created, throw an exception to
* signal the failure.
*
* @return this (self reference, allowing this to be chained in an
* initialization call)
* @throws SQLException if the database could be neither opened or created
*/
public MyAdapter open() throws SQLException {
mDbHelper = new DatabaseHelper(mCtx);
mDb = mDbHelper.getWritableDatabase();
return this;
}
public void close() {
mDbHelper.close();
}
}
तो फिर तुम इस तरह के रूप में अपने परीक्षण लिख सकते हैं:: हम सिर्फ हमारे डेटाबेस में लेखन पहुँच रही फैंसी कुछ नहीं के लिए open()
पर ध्यान केंद्रित करेंगे
public final class MyAdapterTests extends AndroidTestCase {
private static final String TEST_FILE_PREFIX = "test_";
private MyAdapter mMyAdapter;
@Override
protected void setUp() throws Exception {
super.setUp();
RenamingDelegatingContext context
= new RenamingDelegatingContext(getContext(), TEST_FILE_PREFIX);
mMyAdapter = new MyAdapter(context);
mMyAdapter.open();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
mMyAdapter.close();
mMyAdapter = null;
}
public void testPreConditions() {
assertNotNull(mMyAdapter);
}
}
तो क्या यहाँ क्या हो रहा है यह है कि संदर्भ कार्यान्वयन RenamingDelegatingContext
, एक बार MyAdapter(context).open()
कहा जाता है, हमेशा डेटाबेस को फिर से बना देगा। आपके द्वारा लिखे गए प्रत्येक परीक्षण को MyAdapter.DATABASE_CREATE_STATEMENT
के बाद डेटाबेस की स्थिति के विरुद्ध जा रहा है।
[जुनीट 4 शैली में परीक्षण एंड्रॉइड डेटाबेस] (http://www.singhajit.com/testing-android-database/) –