gpt4 book ai didi

android - Android 的 ServiceTestCase 可以向我的服务发送消息吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:59:06 24 4
gpt4 key购买 nike

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

来自日志:

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 的代码:

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 的代码:

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();
}
}

}

最佳答案

我能够使用下面的过程使它工作。如果这不正确,欢迎任何人提出意见,但上面的示例有效(即 MyBindServer 的处理程序接收消息)

似乎 ServiceTestCase 的 bindService() 方法打算充当本地服务。在这种情况下,目标是作为一个单独的进程进行测试,这意味着使用以下而不是 ServiceTestCase 的 bindService:

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。

通过以上,MyBindServer 的 handleMessage() 被调用用于 testAHello() 测试。

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

例如

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");
}
};

然后添加:

while(!processed){      
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

测试AHello()

关于android - Android 的 ServiceTestCase<MyService> 可以向我的服务发送消息吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6604613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com