简体   繁体   中英

doInBackground() not getting executed when called from test class

I'm very new to writing unit tests in Android.

I have a singleton class as follows

public enum DownloadController {
    INSTANCE;

    private AsyncTask<?, ?, ?> mRunningTask;

    /*
    * @param LoginListener
    * Request for getting full name of an user.
    * */
    public void getTrackName(DownloadListener listener){
        if(mRunningTask != null) mRunningTask.cancel(true);
        mListener = listener;
        mRunningTask = new DownloadTask();
        try {
            mRunningTask.execute();
        }catch (Exception e){
            e.getLocalizedMessage();
        }
    }

    //Task which gets us the full name of an user
    public class DownloadTask extends AsyncTask<Void, Void, String> {

        @Override
        public String doInBackground(Void... params) {
            String trackName;
            try {
                trackName = getTrackName();
            } catch (VolleyError | AuthException volleyError) {
                trackName = "error"
            }
            return trackName;
        }

        @Override
        public void onPostExecute(String name) {
            if (mListener != null) {
                mListener.onNameObtained(name);
            }
        }
    }
}

For this I have a Test class as follows

@RunWith(PowerMockRunner.class)
@PrepareForTest({DownloadController.class})
@Config(constants = BuildConfig.class, emulateSdk = 19, manifest="src/main/AndroidManifest.xml")
public class DownloadControllerTest {

    DownloadController mSubject;
    String mTrackName;


    @Before
    public void setUp() {
        mSubject = DownloadController.INSTANCE;
    }

    @Test
    public void getTrackName_test() throws InterruptedException, AuthException, VolleyError {
        // execute
        final DownloadCallback callback = new DownloadCallback();
        mSubject.getTrackName(callback);
        callback.blockForResult();
        // verify
        assertThat(callback.mTrackName, is("Track1"));
    }

    private class DownloadCallback implements DownloadListener {
        CountDownLatch mLatch = new CountDownLatch(1);
        String mFullname;

        @Override
        public void onNameObtained(String fullName) {
            mFullname = fullName;
            mLatch.countDown();
        }

        public void blockForResult() throws InterruptedException {
            mLatch.await();
        }
    }
}

Here mSubject.getTrackName(callback); calls the method getTrackName() in DownloadManager.java but new DownloadTask().execute(); is not invoking doInBackground() method in asynTask . This leads test case is in infinite loop.

我认为您必须调用测试Robolectric.flushBackgroundThreadScheduler()来执行asynctask

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM