首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓的ServiceTestCase<MyService>可以向我的服务发送消息吗?

安卓的ServiceTestCase<MyService>可以向我的服务发送消息吗?
EN

Stack Overflow用户
提问于 2011-07-07 08:37:24
回答 1查看 4.8K关注 0票数 5

我想用ServiceTestCase测试我绑定的服务。测试包括绑定到MyBindServer和发送消息。查看日志,您可以看到在调用onBind()时启动了服务,并且从testAHello()发送了一条消息,但是从未调用过服务器的handleMessage()。

从日志中:

代码语言:javascript
复制
I/TestRunner( 2099): started: testAHello(com.inthinc.mybindserver.test.MyBindServerTest)
I/MyBindServerTest( 2099): setUp()
I/MyBindServer( 2099): onBind, action=com.inthinc.mybindserver.START
I/MyBindServerTest( 2099): testAHello
I/MyBindServerTest( 2099): sending SAY_HELLO
[here is where I expect to see the output from handleMessage()]
I/MyBindServerTest( 2099): tearDown()
I/TestRunner( 2099): finished:testAHello(com.inthinc.mybindserver.test.MyBindServerTest)
I/TestRunner( 2099): passed: testAHello(com.inthinc.mybindserver.test.MyBindServerTest)

以下是MyBindServer.java的代码:

代码语言:javascript
复制
package com.inthinc.mybindserver;

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.util.Log;

public class MyBindServer extends Service {
    static final String TAG = "MyBindServer";
    public static final int MSG_SAY_HELLO = 1;
    final Messenger mMessenger = new Messenger(new IncomingHandler());

    class IncomingHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            Log.i(TAG, String.format("handleMessage, what=%d", msg.what));
            switch (msg.what) {
                case MSG_SAY_HELLO:
                    Log.i(TAG, "hello");
                    break;
                default:
                    super.handleMessage(msg);
            }
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.i(TAG, String.format("onBind, action=%s", intent.getAction()));
        return mMessenger.getBinder();
    }

}

以下是MyBindServerTest.java的代码:

代码语言:javascript
复制
package com.inthinc.mybindserver.test;

import com.inthinc.mybindserver.MyBindServer;

import android.content.Intent;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.test.ServiceTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Log;

public class MyBindServerTest extends ServiceTestCase<MyBindServer> {
    private static final String TAG = "MyBindServerTest";
    Messenger mServer = null;

    public MyBindServerTest() {
        super(MyBindServer.class);
    }

    public MyBindServerTest(Class<MyBindServer> serviceClass) {
        super(serviceClass);
    }

    @Override
    public void setUp() {
        try {
            super.setUp();
            Log.i(TAG, "setUp()");
            Intent bindIntent = new Intent("com.inthinc.mybindserver.START");
            IBinder binder = bindService(bindIntent);
            assertNotNull(binder);
            mServer = new Messenger(binder);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void tearDown() {
        try {
            super.tearDown();
            Log.i(TAG, "tearDown()");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @SmallTest
    public void testAHello() {
        Log.i(TAG, "testAHello");
        assertNotNull(mServer);
        Message msg = Message.obtain(null, MyBindServer.MSG_SAY_HELLO);
        Log.i(TAG, "sending SAY_HELLO");
        try {
            mServer.send(msg);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-30 07:03:30

如果这是错误的,我可以使用过程below..anyone进行处理,但上面的例子是有效的(即MyBindServer的处理程序接收消息)

看起来ServiceTestCase的bindService()方法想要像一个本地服务一样工作。在这种情况下,目标是作为一个单独的进程进行测试,这意味着使用以下代码而不是ServiceTestCase的bindService:

代码语言:javascript
复制
Intent bindIntent = new Intent(<registered intent>); //Where registered intent is declared in the manifest file
getContext().bindService(bindIntent,mConn,Context.BIND_AUTO_CREATE);

其中mConn是一个实现的ServiceConnection对象,用于执行测试需要它做的任何事情,在上面的例子中,设置mServer。

执行上述操作后,将为testAHello()测试调用MyBindServer的handleMessage()。

更新:我注意到,根据测试处理的完成速度,可以在绑定准备使用之前调用teardown()。在上面的例子中,根据被调用的mConn的onServiceConnected添加控制变量来限制程序流,可以得到一致的结果。

例如。

代码语言:javascript
复制
protected boolean bound = false;
protected boolean processed = false;
private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className,
            IBinder service) {
        Log.i(TAG,"Service conn");

        mServer = new Messenger(service);
        if(mServer != null
                && mServer != null){
            bound = true;
        }
        processed = true;
    }

@Override
public void onServiceDisconnected(ComponentName name) {
    // TODO Auto-generated method stub
    Log.i(TAG,"Service Disconn");
}
};

然后添加:

代码语言:javascript
复制
while(!processed){      
try {
   Thread.sleep(1000);
   } catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
   }
}   

转到testAHello()

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6604613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档