Question

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?

Was it helpful?

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();
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top