androidsqlitenullpointerexceptionjunit3

Android TestCase Junit3


Im trying to test next code:

public class MessagerTest extends TestCase  {
Messager mClassToTest;
Context mArg1;
String mArg2;
protected void setUp() throws Exception {
     mClassToTest=new Messager();
     mArg1= getTestContext();
     mArg2= "5556";
    super.setUp();
}

protected void tearDown() throws Exception {
    super.tearDown();
}

 public void testscreateConnection(){
     assertTrue(mClassToTest.createConnection(mArg1, mArg2));
 }

 public void testsadd()
 {
     assertEquals(11, mClassToTest.add(5, 6));
 }

 /**
  * @return The {@link Context} of the test project.
  */
 private Context getTestContext()
 {
     try
     {
         Method getTestContext = ServiceTestCase.class.getMethod("getTestContext");
         return (Context) getTestContext.invoke(this);
     }
     catch (final Exception exception)
     {
         exception.printStackTrace();
         return null;
     }
 }
 }

and code i am testing is

public boolean createConnection(Context context, String number)
{
    DatabaseHandler db = new DatabaseHandler(context);

    contact = db.getContactByNumber(number);
    String id = String.valueOf(contact.getID());

    if(id.equals("0"))
    {
        // send message
        PendingIntent pi = PendingIntent.getActivity(context, 0,
                new Intent(context, CreateConnection.class), 0);

        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm",
                Locale.UK);

        currentDateandTime = sdf.format(new Date());

        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(number, null, "1|031|", pi, null);

        // add to db
        db.addContact(new Contact("", number, "", 
                "", 2, "40", currentDateandTime)); 

        return true;
    }else{
        return false;
    }
}

for some reason when I run test, for testscreateConnection, it seem to fail on the first line at contact = db.getContactByNumber(number); with a NullPointerException. Fail happens on the first line of the function SQLiteDatabase db = this.getReadableDatabase();

getContactByNumber code:

 public Contact getContactByNumber(String number)
    {
        SQLiteDatabase db = this.getReadableDatabase();

        Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
                KEY_NAME, KEY_PH_NO, KEY_PUB_KEY, KEY_IDENTIFIER, KEY_DELETE,
                KEY_STATUS, KEY_DATETIME }, KEY_PH_NO + "=?",
                new String[] { number }, null, null, null,
                null);

        if(cursor.getCount() > 0)
        {
            if(cursor != null)
            {
                cursor.moveToFirst();
            }

            Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
                    cursor.getString(1), cursor.getString(2), cursor.getString(3),
                    cursor.getString(4), Integer.parseInt(cursor.getString(5)),
                    cursor.getString(6), cursor.getString(7));

            // return contact
            return contact;
        }else{
            Contact contact = new Contact();
            return contact;
        }
    }

How should I go about solving this issue? It kind of makes me think that database is not present at the test version?


Solution

  • Had to update first lines in the test case, the TestCase to ActivityTestCase and context to mArg1= getInstrumentation().getTargetContext();

    public class MessagerTest extends ActivityTestCase  {
    Messager mClassToTest;
    Context mArg1;
    String mArg2;
    protected void setUp() throws Exception {
         mClassToTest=new Messager();
         mArg1= getInstrumentation().getTargetContext();
         mArg2= "5558";
        super.setUp();
    }