Android JUnit:在处理程序

时间:2015-06-12 21:43:13

标签: java android eclipse junit testcase

我正在尝试在处理程序中创建一个断言,但没有成功。我尝试用线程,runnables等执行它。下一个代码就是一个例子:

public class ServerTest extends AndroidTestCase {
    private final String TAG = this.getClass().getSimpleName(); 
    private final int ACK = 1;

    public void testSendToServer(){
        final ServerStub server = new ServerStub();         
        final CountDownLatch signal = new CountDownLatch(1);        

        new Thread(new Runnable() {             
            Handler handler = new Handler(new Handler.Callback() {
                @Override
                public boolean handleMessage(Message msg) {
                    // This log never appear
                    Log.w(TAG, "handleMessage(Message "+msg+")");
                    assertEquals(ACK, msg.what);

                    signal.countDown();
                    return true;
                }
            });

            @Override
            public void run() {
                // This log never appear
                Log.w(TAG, "sentToServer()");
                server.sentToServer(handler);               
            }
        }).start(); 

        try {
            signal.await(15, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }           
        //This assert fails
        assertEquals(0, signal.getCount());
    }

    class ServerStub{
        private final String TAG = this.getClass().getSimpleName(); 

        public void sentToServer(Handler handler){
            Message message = new Message();
            message.what = ACK;

            Log.i(TAG, "ACK_RECEIVED");
            handler.sendMessage(message);
        }
    }
}

我想测试一个不返回任何内容的方法类,只是“做某事”并使用处理程序返回响应。

我执行下一个意图的测试用例testSendToServer()

在此测试中,创建了一个具有方法sentToServer(Handler handler)的ServerStub。在此方法中,只需向处理程序发送“ACK”消息。 之后,我创建了CountDownLatch signal = new CountDownLatch(1);来在处理程序signal.countDown();方法中调用handleMessage(Message msg)以了解它是否已执行。

继续测试,我创建了一个新的Thread,其中创建了一个Handler并调用了sentToServer(Handler handler)。在处理程序内部也会调用assertEquals(ACK, msg.what);,我需要知道ServerStub是否向我发送了“ACK”。

主线程正在等待15秒或执行signal.countDown();。最后调用assertEquals(0, signal.getCount());检查Handler是否已执行。

但是永远不会执行处理程序handleMessage(Message msg)方法。

我读了其他帖子,我尝试了很多例子,但我从未找到答案。 有可能是这样吗?

更多信息: 现在我正在尝试在Thread中创建一个处理程序,如下所示:

new Thread() {
        @Override
        public void run() {
            Log.w(TAG, "Thread run");
            Handler handler = new Handler(new Handler.Callback() {
                ...
            }
        }
    }.start();

打印日志“Thread run”但之后我得到“测试运行失败:由于'java.lang.RuntimeException'而导致Instrumentation运行失败”。

0 个答案:

没有答案