Android AsyncTask testing with Android Test Framework

前端 未结 7 1390
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-27 09:42

I have a very simple AsyncTask implementation example and am having problem in testing it using Android JUnit framework.

It works just fine when I instantiate and e

7条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-11-27 10:05

    I wrote enough unitests for Android and just want to share how to do that.

    First off, here is helper class that responsible to wait and release waiter. Nothing special:

    SyncronizeTalker

    public class SyncronizeTalker {
        public void doWait(long l){
            synchronized(this){
                try {
                    this.wait(l);
                } catch(InterruptedException e) {
                }
            }
        }
    
    
    
        public void doNotify() {
            synchronized(this) {
                this.notify();
            }
        }
    
    
        public void doWait() {
            synchronized(this){
                try {
                    this.wait();
                } catch(InterruptedException e) {
                }
            }
        }
    }
    

    Next, lets create interface with one method that should be called from AsyncTask when work is done. Sure we also want to test our results:

    TestTaskItf

    public interface TestTaskItf {
        public void onDone(ArrayList list); // dummy data
    }
    

    Next lets create some skeleton of our Task that we gonna test:

    public class SomeTask extends AsyncTask {
    
       private ArrayList data = new ArrayList(); 
       private WmTestTaskItf mInter = null;// for tests only
    
       public WmBuildGroupsTask(Context context, WmTestTaskItf inter) {
            super();
            this.mContext = context;
            this.mInter = inter;        
        }
    
            @Override
        protected SomeItem doInBackground(Void... params) { /* .... job ... */}
    
            @Override
        protected void onPostExecute(SomeItem item) {
               // ....
    
           if(this.mInter != null){ // aka test mode
            this.mInter.onDone(data); // tell to unitest that we finished
            }
        }
    }
    

    At last - our unitest class:

    TestBuildGroupTask

    public class TestBuildGroupTask extends AndroidTestCase  implements WmTestTaskItf{
    
    
        private SyncronizeTalker async = null;
    
        public void setUP() throws Exception{
            super.setUp();
        }
    
        public void tearDown() throws Exception{
            super.tearDown();
        }
    
        public void test____Run(){
    
             mContext = getContext();
             assertNotNull(mContext);
    
            async = new SyncronizeTalker();
    
            WmTestTaskItf me = this;
            SomeTask task = new SomeTask(mContext, me);
            task.execute();
    
            async.doWait(); // <--- wait till "async.doNotify()" is called
        }
    
        @Override
        public void onDone(ArrayList list) {
            assertNotNull(list);        
    
            // run other validations here
    
           async.doNotify(); // release "async.doWait()" (on this step the unitest is finished)
        }
    }
    

    That's all.

    Hope it will help to someone.

提交回复
热议问题