Android beaconManager.StarTrangBeaconRegion使用Robolectric失败,出现NullPointerException
我正在使用Robolectric测试我的Android应用程序。该应用程序使用AndroidBeaconLibrary。 当我使用Android beaconManager.StarTrangBeaconRegion使用Robolectric失败,出现NullPointerException,android,robolectric,ibeacon-android,altbeacon,android-ibeacon,Android,Robolectric,Ibeacon Android,Altbeacon,Android Ibeacon,我正在使用Robolectric测试我的Android应用程序。该应用程序使用AndroidBeaconLibrary。 当我使用 Activity-Activity=roblectric.setupActivity(MainActivity.class) 作为一个简单的测试,我在onbeacerviceconnect()方法中得到一个错误: @Override public void onBeaconServiceConnect() { beaconManager.se
Activity-Activity=roblectric.setupActivity(MainActivity.class)代码>
作为一个简单的测试,我在onbeacerviceconnect()
方法中得到一个错误:
@Override
public void onBeaconServiceConnect() {
beaconManager.setRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
if (beacons.size() > 0) {
final double distance = beacons.iterator().next().getDistance();
Log.i("X", "The beacon is about " + distance + " meters away.");
if (distance > 1.8 && !mAlertShown) {
mAlertShown = true;
alertOpen();
} else if (distance < 1) {
mAlertShown = false;
Toast.makeText(MainActivity.this, "alert is now reset", Toast.LENGTH_SHORT).show();
}
}
}
});
try {
Identifier i = Identifier.parse("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");
Identifier i2 = Identifier.parse("xxxx");
beaconManager.startRangingBeaconsInRegion(new Region("rangingUniqueId", i, i2, null));
} catch (RemoteException e) {
}
}
@覆盖
beacerviceconnect()上的公共无效{
setRangeNotifier(新的RangeNotifier(){
@凌驾
公共无效范围信标区域(收集信标,区域){
如果(beacons.size()>0){
final double distance=beacons.iterator().next().getDistance();
Log.i(“X”,“信标大约在“+距离+”米远。”);
如果(距离>1.8&&!如图所示){
MalertShowed=true;
alertOpen();
}否则如果(距离<1){
MalertShowed=false;
Toast.makeText(MainActivity.this,“警报现在重置”,Toast.LENGTH_SHORT.show();
}
}
}
});
试一试{
标识符i=标识符。解析(“xxxxxxxx-xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”);
标识符i2=标识符解析(“xxxx”);
beaconManager.startrangbeaconregion(新区域(“ranginginuniqueid”,i,i2,null));
}捕获(远程异常){
}
}
调用beaconManager.starTrangbeaconRegion(新区域(“rangingUniqueId”,i,i2,null))后该方法失败
atthis.serviceMessenger.send(msg)在BeaconManager.class
中的code>。使用NullPointerException
当我在手机上部署应用程序时,一切正常。我无法发表评论,所以我将把它写在这里作为答案,但这听起来像这样。serviceMessenger.send(msg);msg的值为NULL,这就是为什么会出现异常
public void startRangingBeaconsInRegion(Region region) throws RemoteException {
Message msg = Message.obtain(null, IBeaconService.MSG_START_RANGING, 0, 0);
StartRMData obj = new StartRMData(new RegionData(region), rangingCallbackAction());
msg.obj = obj;
msg.replyTo = rangingCallback;
if(msg != null){
serviceMessenger.send(msg);
}
}
是的。但是,我不知道为什么msg是空的。它在BeaconManager.class中,在真实设备上运行该应用程序时,一切正常。为什么我用Robolectric.setupActivity()来测试它时它会是空的?你可以编辑IBeaconManager.class,如果它是空的,就不做那部分工作。我会用代码编辑我的答案我不确定结果会是什么;)类来自AltBeacon Android Beacon库依赖项。因此,我无法修改.class文件。您可以从下载源代码,然后对其进行编辑。然后将其添加为i库,但我不确定这是否值得,因为它在真实设备上工作,您必须自己决定。您的测试是否手动调用BeaConserviceConnect
?还是该方法会自动调用?查看您的Robolectric测试方法会很有帮助。我的测试类中唯一的一行是Activity=Robolectric.setupActivity(MainActivity.class);。在此设置活动过程中调用onBeaconServiceConnect方法。onBeaconServiceConnect
调用是在MainActivity.java内还是在setupActivity
方法内?要知道Robolectric并没有提供Android SDK的有效实现,只是提供了存根。方法调用通常返回null,就像您描述的情况一样。因此,如果您在setupActivity
中调用了onbeacerviceconnect
,它可能不应该在那里。onbeacerviceconnect
方法在我的MainActivity.class
中,它实现了BeaconConsumer
接口。我只是按照一个简单的机器人分子示例来设置/构建一个活动。我还尝试将setupActivity(MainActivity.class)
替换为buildActivity(MainActivity.class).create().get()
,这导致了相同的异常。同时,我的其他测试(web服务、数据库等)都已启动并运行。我只是想了解NullPointerException是从哪里来的。也许是因为像你说的,Robolectric只处理存根。