lundi 31 août 2015

How to test asyc retrofit calls in Android unit tests?

I am struggling to write unit tests for my API implementation in Android. I would like to test the Retrofit functionality but run into concurrency problems, where I do not know how to ensure that the async API calls get executed and finish before I start testing the Android internal database calls.

Here is my test function:

public class postPrintModeTest extends ActivityInstrumentationTestCase2<MainActivity> implements IConstants {
public MainActivity activity;

public postPrintModeTest() {
    super(MainActivity.class);
}

@Override
protected void setUp() throws Exception {
    super.setUp();
    activity = getActivity();

    String printModeName = "LSD Mode";
    int parentId = 4;
    Map<String, Object> payload = new HashMap<String, Object>();
    payload.put("name", printModeName);
    payload.put("parentId", parentId);

    APIExec.getInstance().postPrintMode(IConstants.authorization, IConstants.userId, IConstants.deviceUid, payload); // <- this needs to finish before I execute the tests, so I have proper data in the database.
}

@SmallTest
public void testPrintModeCreated() {
    DBPrintMode printMode = APIDBOps.getInstance().readPrintModeByPrintModeID(6);

    assertNotNull("Print Mode does not exist", printMode);
}

@SmallTest
public void testPrintModeName() {
    DBPrintMode printMode = APIDBOps.getInstance().readPrintModeByPrintModeID(6);

    if(printMode != null)
    {
        assertTrue("Print Mode name is not correct", printMode.getName().equals("LSD Mode"));
    }
}

}

and here is the async method in question:

public void postPrintMode(String authorization, final int userid, String deviceuid, final Map payload){
    api.postPrintMode(authorization, userid, deviceuid, payload, new Callback<PrintMode>() {

        @Override
        public void success(PrintMode printMode, Response response) {

            if (printMode.get_id() != 0) {
                dbOps.writePrintMode(userid, printMode);
                bus.getBus().post(new EVTNewPrintMode(printMode));
            }
        }

        @Override
        public void failure(RetrofitError retrofitError) {
            retrofitError.printStackTrace();
            APIUtils.showAPIResponseBody(retrofitError);
        }
    });
}

Aucun commentaire:

Enregistrer un commentaire