diff --git a/src/com/android/providers/blockednumber/BlockedNumberDatabaseHelper.java b/src/com/android/providers/blockednumber/BlockedNumberDatabaseHelper.java
index f3138fa..005c918 100644
--- a/src/com/android/providers/blockednumber/BlockedNumberDatabaseHelper.java
+++ b/src/com/android/providers/blockednumber/BlockedNumberDatabaseHelper.java
@@ -21,10 +21,9 @@
 import android.provider.BlockedNumberContract.BlockedNumbers;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.Preconditions;
 
 public class BlockedNumberDatabaseHelper {
-    private static final String TAG = BlockedNumberProvider.TAG;
-
     private static final int DATABASE_VERSION = 1;
 
     private static final String DATABASE_NAME = "blockednumbers.db";
@@ -72,6 +71,7 @@
     }
 
     private BlockedNumberDatabaseHelper(Context context, boolean instanceIsForTesting) {
+        Preconditions.checkNotNull(context);
         mContext = context;
         mOpenHelper = new OpenHelper(mContext,
                 instanceIsForTesting ? null : DATABASE_NAME, null, DATABASE_VERSION);
@@ -79,8 +79,9 @@
 
     public static synchronized BlockedNumberDatabaseHelper getInstance(Context context) {
         if (sInstance == null) {
-            sInstance = new BlockedNumberDatabaseHelper(context.getApplicationContext(),
-                    /* instanceIsForTesting =*/ false);
+            sInstance = new BlockedNumberDatabaseHelper(
+                    context,
+                    /* instanceIsForTesting = */ false);
         }
         return sInstance;
     }
diff --git a/src/com/android/providers/blockednumber/BlockedNumberProvider.java b/src/com/android/providers/blockednumber/BlockedNumberProvider.java
index 13e977c..72a0c93 100644
--- a/src/com/android/providers/blockednumber/BlockedNumberProvider.java
+++ b/src/com/android/providers/blockednumber/BlockedNumberProvider.java
@@ -30,6 +30,7 @@
 import android.text.TextUtils;
 import android.util.Log;
 import com.android.common.content.ProjectionMap;
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.providers.blockednumber.BlockedNumberDatabaseHelper.Tables;
 
 /**
@@ -64,15 +65,15 @@
     private static final String ID_SELECTION =
             BlockedNumberContract.BlockedNumbers.COLUMN_ID + "=?";
 
+    @VisibleForTesting
+    protected BlockedNumberDatabaseHelper mDbHelper;
+
     @Override
     public boolean onCreate() {
+        mDbHelper = BlockedNumberDatabaseHelper.getInstance(getContext());
         return true;
     }
 
-    BlockedNumberDatabaseHelper getDbHelper() {
-        return BlockedNumberDatabaseHelper.getInstance(getContext());
-    }
-
     /**
      * TODO CTS:
      * - BLOCKED_LIST
@@ -141,7 +142,7 @@
         cv.put(BlockedNumberContract.BlockedNumbers.COLUMN_E164_NUMBER, e164Number);
 
         // Then insert.
-        final long id = getDbHelper().getWritableDatabase().insertOrThrow(
+        final long id = mDbHelper.getWritableDatabase().insertOrThrow(
                 BlockedNumberDatabaseHelper.Tables.BLOCKED_NUMBERS, null, cv);
 
         return ContentUris.withAppendedId(BlockedNumberContract.BlockedNumbers.CONTENT_URI, id);
@@ -198,7 +199,7 @@
      * Implements the "blocked/" delete.
      */
     private int deleteBlockedNumber(String selection, String[] selectionArgs) {
-        final SQLiteDatabase db = getDbHelper().getWritableDatabase();
+        final SQLiteDatabase db = mDbHelper.getWritableDatabase();
 
         // When selection is specified, compile it within (...) to detect SQL injection.
         if (!TextUtils.isEmpty(selection)) {
@@ -207,7 +208,7 @@
                     /* cancellationSignal =*/ null);
         }
 
-        return getDbHelper().getWritableDatabase().delete(
+        return db.delete(
                 BlockedNumberDatabaseHelper.Tables.BLOCKED_NUMBERS,
                 selection, selectionArgs);
     }
@@ -260,7 +261,7 @@
         qb.setTables(BlockedNumberDatabaseHelper.Tables.BLOCKED_NUMBERS);
         qb.setProjectionMap(sBlockedNumberColumns);
 
-        return qb.query(getDbHelper().getReadableDatabase(), projection, selection, selectionArgs,
+        return qb.query(mDbHelper.getReadableDatabase(), projection, selection, selectionArgs,
                 /* groupBy =*/ null, /* having =*/null, sortOrder,
                 /* limit =*/ null, cancellationSignal);
     }
@@ -306,7 +307,7 @@
                     inStripped, inE164));
         }
 
-        final Cursor c = getDbHelper().getReadableDatabase().rawQuery(
+        final Cursor c = mDbHelper.getReadableDatabase().rawQuery(
                 "SELECT " +
                 BlockedNumberContract.BlockedNumbers.COLUMN_ORIGINAL_NUMBER + "," +
                 BlockedNumberContract.BlockedNumbers.COLUMN_STRIPPED_NUMBER + "," +
diff --git a/tests/Android.mk b/tests/Android.mk
index d85d7bb..8f500de 100644
--- a/tests/Android.mk
+++ b/tests/Android.mk
@@ -13,7 +13,7 @@
 # Only compile source java files in this apk.
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
-LOCAL_PACKAGE_NAME := BlockedNumberProviderTests
+LOCAL_PACKAGE_NAME := BlockedNumberProviderTest
 
 LOCAL_INSTRUMENTATION_FOR := BlockedNumberProvider
 LOCAL_CERTIFICATE := shared
diff --git a/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTest.java b/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTest.java
index 8ec71eb..fb9a81a 100644
--- a/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTest.java
+++ b/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTest.java
@@ -23,7 +23,6 @@
 import android.database.sqlite.SQLiteConstraintException;
 import android.database.sqlite.SQLiteException;
 import android.net.Uri;
-import android.os.Bundle;
 import android.provider.BlockedNumberContract;
 import android.provider.BlockedNumberContract.BlockedNumbers;
 import android.test.AndroidTestCase;
@@ -31,11 +30,10 @@
 import junit.framework.Assert;
 
 /**
- m BlockedNumberProviderTests &&
- adb install -r \
- ${ANDROID_PRODUCT_OUT}/data/app/BlockedNumberProviderTests/BlockedNumberProviderTests.apk &&
- adb shell am instrument -e class com.android.providers.blockednumber.BlockedNumberProviderTest \
- -w com.android.providers.blockednumber.tests/android.support.test.runner.AndroidJUnitRunner
+ * m BlockedNumberProviderTest && adb install -r
+ * ${ANDROID_PRODUCT_OUT}/data/app/BlockedNumberProviderTest/BlockedNumberProviderTest.apk && adb
+ * shell am instrument -e class com.android.providers.blockednumber.BlockedNumberProviderTest \ -w
+ * com.android.providers.blockednumber.tests/android.support.test.runner.AndroidJUnitRunner
  */
 public class BlockedNumberProviderTest extends AndroidTestCase {
     private Context mRealTestContext;
@@ -144,7 +142,7 @@
     private void insertExpectingFailure(ContentValues cv) {
         try {
             mResolver.insert(
-                    BlockedNumbers.CONTENT_URI, cv());
+                    BlockedNumbers.CONTENT_URI, cv);
             fail();
         } catch (IllegalArgumentException expected) {
         }
@@ -206,8 +204,8 @@
 
     public void testIsBlocked() {
         // Prepare test data
-        Uri u1 = insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "123"));
-        Uri u2 = insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "+1.2-3"));
+        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "123"));
+        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "+1.2-3"));
         insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "+1-500-454-1111"));
         insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "1-500-454-2222"));
 
diff --git a/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTestable.java b/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTestable.java
index 3c95089..b67b1ab 100644
--- a/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTestable.java
+++ b/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTestable.java
@@ -16,23 +16,13 @@
 package com.android.providers.blockednumber;
 
 public class BlockedNumberProviderTestable extends BlockedNumberProvider {
-    private BlockedNumberDatabaseHelper mDbHelper;
-
     @Override
     public boolean onCreate() {
-        super.onCreate();
-
         mDbHelper = BlockedNumberDatabaseHelper.newInstanceForTest(getContext());
-
         return true;
     }
 
     @Override
-    BlockedNumberDatabaseHelper getDbHelper() {
-        return mDbHelper;
-    }
-
-    @Override
     public void shutdown() {
         mDbHelper.getReadableDatabase().close();
 
