Android SQLite Test
Most of the secret of implementing SQLite Test with JUnit unit tests, is in the use of the assert methods in the class org.junit.Assert. In this text I will take a closer look at what assert methods are available in this class.
The most easy way is to use InstrumentationRegistry in android test package
mDataSource = new RateDataSource(InstrumentationRegistry.getTargetContext());
We can start with a normal SQLite class with CRUD (Create, Read, Update and Delete).
public class RateDataSource { // Database fields private SQLiteDatabase mDatabase; private MySQLiteHelper mDbHelper; private String[] mAllColumns = {MySQLiteHelper.COLUMN_ID, MySQLiteHelper.COLUMN_COIN, MySQLiteHelper.COLUMN_VALUE}; public RateDataSource(Context context) { mDbHelper = new MySQLiteHelper(context); } public void open() throws SQLException { mDatabase = mDbHelper.getWritableDatabase(); } public void close() { mDbHelper.close(); } public Rate createRate(String coin, double value) { ContentValues values = new ContentValues(); values.put(MySQLiteHelper.COLUMN_COIN, coin); values.put(MySQLiteHelper.COLUMN_VALUE, value); long insertId = mDatabase.insert(MySQLiteHelper.TABLE_RATE, null, values); Cursor cursor = mDatabase.query(MySQLiteHelper.TABLE_RATE, mAllColumns, MySQLiteHelper.COLUMN_ID + " = " + insertId, null, null, null, null); cursor.moveToFirst(); Rate newComment = cursorToRate(cursor); cursor.close(); return newComment; } public void deleteRate(Rate comment) { long id = comment.getId(); System.out.println("Rate deleted with id: " + id); mDatabase.delete(MySQLiteHelper.TABLE_RATE, MySQLiteHelper.COLUMN_ID + " = " + id, null); } public List<Rate> getAllRates() { List<Rate> rates = new ArrayList<Rate>(); Cursor cursor = mDatabase.query(MySQLiteHelper.TABLE_RATE, mAllColumns, null, null, null, null, null); cursor.moveToFirst(); while (!cursor.isAfterLast()) { Rate rate = cursorToRate(cursor); rates.add(rate); cursor.moveToNext(); } // make sure to close the cursor cursor.close(); return rates; } private Rate cursorToRate(Cursor cursor) { Rate rate = new Rate(); rate.setId(cursor.getLong(0)); rate.setCoin(cursor.getString(1)); rate.setValue(cursor.getDouble(2)); return rate; } public void deleteAll() { mDatabase.delete(MySQLiteHelper.TABLE_RATE, null, null); } }
After that you can start with your unit test, don’t forget to open and close database:
import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import android.test.suitebuilder.annotation.LargeTest; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.util.List; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; @RunWith(AndroidJUnit4.class) @LargeTest public class SQLiteTest { private RateDataSource mDataSource; @Before public void setUp(){ mDataSource = new RateDataSource(InstrumentationRegistry.getTargetContext()); mDataSource.open(); } @After public void finish() { mDataSource.close(); } @Test public void testPreConditions() { assertNotNull(mDataSource); } @Test public void testShouldAddExpenseType() throws Exception { mDataSource.createRate("AUD", 1.2); List<Rate> rate = mDataSource.getAllRates(); assertThat(rate.size(), is(1)); assertTrue(rate.get(0).toString().equals("AUD")); assertTrue(rate.get(0).getValue().equals(1.2)); } @Test public void testDeleteAll() { mDataSource.deleteAll(); List<Rate> rate = mDataSource.getAllRates(); assertThat(rate.size(), is(0)); } @Test public void testDeleteOnlyOne() { mDataSource.createRate("AUD", 1.2); List<Rate> rate = mDataSource.getAllRates(); assertThat(rate.size(), is(1)); mDataSource.deleteRate(rate.get(0)); rate = mDataSource.getAllRates(); assertThat(rate.size(), is(0)); } @Test public void testAddAndDelete() { mDataSource.deleteAll(); mDataSource.createRate("AUD", 1.2); mDataSource.createRate("JPY", 1.993); mDataSource.createRate("BGN", 1.66); List<Rate> rate = mDataSource.getAllRates(); assertThat(rate.size(), is(3)); mDataSource.deleteRate(rate.get(0)); mDataSource.deleteRate(rate.get(1)); rate = mDataSource.getAllRates(); assertThat(rate.size(), is(1)); } }
you can see the complete code in GitHub