- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想用 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/
我使用的是 Jackson 自定义序列化器,已知该序列化器不支持 Spring 依赖项注入(inject),因此我的序列化器类如下: public class ShippingAddressDataS
我想用 ServiceTestCase 测试我绑定(bind)的服务。测试包括绑定(bind)到 MyBindServer 和发送消息。查看日志,您可以看到调用 onBind() 时服务已启动,并且从
这个比那个好吗? 这甚至是一个有效的问题吗? 我最近被告知 MyObject.DoSomething()已经过时了,服务方式是首选。那正确吗? 例子: public class Policy : IC
如何将参数传递给 installutil MyService.exe Parameter1 Parameter2 我 MyService 是一个 Windows 服务。我想将参数传递给这个服务。 最佳
我正在尝试在 FeathersJS 应用程序中扩展名为 properties 的服务的 find() 方法。 我需要的是在 find() 返回的所有记录中附加一个数组,其中的整数来自另一个名为 pro
我有一个用 C# 创建的网站,用于在服务器中启动服务。 我创建了一个名为 MyService 的服务使用这个: instsrv MyService %systemroot%\system32\srva
我使用 c#、ASP.NET Core、EF。 我有 Startup.cs: public void ConfigureServices(IServiceCollection services)
我的 WCF 服务似乎使用的是计算机名而不是域名。当我查看 MyService.svc?wsdl 链接时,它显示我的计算机名称。 我应该在 web.config 的什么地方添加我的域名?端点地址、基址
我创建了一个带有 wsHttpBinding 和 mexHttpBinding 的 WCF 服务。在 IIS6 中在 http 上运行时,myservice.svc 显示通常的“您已创建服务”。页。
我在 Service Fabric Stateless ASP.NET Core 应用程序中看到以下异常。 System.InvalidOperationException: Unable to re
我想在启动时执行可执行文件 在装有 Android 5.1 的目标板上 所以我在 init.rc 中添加了这个: on boot start myservice service myservi
我遇到了这个错误,我尝试了不同的方法,但仍然没有找到任何解决方案。 这是我的代码: app.js angular.module('myApp', [ 'myApp.services','myA
我遇到了这个错误,我尝试了不同的方法,但仍然没有找到任何解决方案。 这是我的代码: services.js angular .module('myApp.services',[]) .service(
我一直在我的服务的端点对象之一上不一致地收到以下错误。 :“无法更新端点默认值/myservice:无法在端点“myservice”上完成操作:对象已被修改;请将您的更改应用到最新版本,然后重试”。我
我希望通知管理器显示一个弹出窗口,其中有一个“X”按钮可以关闭它。关闭时,我希望 BroadcastReceiver 在已注册接收器和通知的服务上调用一个方法,并且是容器。 RemoteViews r
考虑这个 mocha 测试: var Sails = require('sails'); describe("Foo Model creation:", function() { // creat
stackoverflow 上有很多类似的问题,但我发现没有一个适合我的情况。 在我与 Spring boot 2.0.2.RELEASE 的集成测试中,我为测试创建了一个单独的 @Configura
我不能提交,但我可以更新。 当我尝试提交时,出现以下错误: access to '/svn/myservice/!svn/act/d99e498e-9a8d-374c-a3e4-fde21198bfa
使用 CachingFramework.Redis 时,我尝试将对象插入到键、字段哈希中... enter code here var map = new MyMapping { DataSou
我正在浏览将 auth0 设置为此处列出的 AWS 的 API 网关授权方的教程:https://auth0.com/docs/integrations/aws-api-gateway/custom-
我是一名优秀的程序员,十分优秀!