Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用Robolectric的粘性广播的自定义上下文_Android_Robolectric - Fatal编程技术网

Android 使用Robolectric的粘性广播的自定义上下文

Android 使用Robolectric的粘性广播的自定义上下文,android,robolectric,Android,Robolectric,我想用Robolectric测试我的广播接收器,它依赖于粘性广播。默认情况下,Robolectric不支持粘性广播,因此我创建了自定义的上下文,以使粘性广播按如下方式工作: public class MyContext extends MockContext { public MyContext() { super(); } @Override public Intent registerReceiver(BroadcastReceiver r

我想用Robolectric测试我的
广播接收器
,它依赖于粘性广播。默认情况下,Robolectric不支持粘性广播,因此我创建了自定义的
上下文
,以使粘性广播按如下方式工作:

public class MyContext extends MockContext {

    public MyContext() {
        super();
    }

    @Override
    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
        if(receiver == null) { // A sticky broadcast was requested
            Intent request = new Intent();
            String action = filter.getAction(0);

            if(Intent.ACTION_BATTERY_CHANGED.equals(action)) {
                request.putExtra(BatteryManager.EXTRA_PLUGGED, 1);
            } else if(Intent.ACTION_HEADSET_PLUG.equals(action)) {
                request.putExtra("state", 1); 
            }

            return request;
        }

        return super.registerReceiver(receiver, filter);
    }
}
我的问题是,我必须使用
RuntimeEnvironment.application.getApplicationContext
来获取有效的
Context
对象(我试图简单地调用自定义
Context
的构造函数,但这不起作用)。那么,我如何才能获得自定义
上下文的有效实例呢?或者,使用robolectric不可能吗

编辑:以下是我的测试和广播接收器中的代码:

@Before
public void setup() {
    context = RuntimeEnvironment.application.getApplicationContext();
    receiver = new MyBroadcastReceiver(); // Create Receiver
}

@After
public void finish() {
    context.unregisterReceiver(receiver);
}

@Test
public void validateUsbChargingChange() {
    IntentFilter filter = new IntentFilter("android.intent.action.ACTION_POWER_CONNECTED");
    context.registerReceiver(receiver, filter);

    // Simmulate SocketCharging by sending the corresponding Intent
    Intent chargingChange = new Intent("android.intent.action.ACTION_POWER_CONNECTED");
    RuntimeEnvironment.application.sendBroadcast(chargingChange);

    validatePreferences();
}
广播接收器:

@Override
public void onReceive(Context context, Intent intent) {
    IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    Intent chargingIntent = appContext.registerReceiver(null, iFilter); // sticky
    int pluggedState = chargingIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);

    boolean usbCharge = (pluggedState == BatteryManager.BATTERY_PLUGGED_USB);
    if(usbCharge) {  /* Write values to preferences */  }
}

您可以在测试类构造函数中显式地发送StickBroadcast,如下所示

@RunWith(RobolectricTestRunner.class)
public class BatterySettingActivityTest {
    {
        ApplicationProvider.getApplicationContext().sendStickyBroadcast(new Intent(Intent.ACTION_BATTERY_CHANGED).putExtra(BatteryManager.EXTRA_LEVEL, 75).putExtra(BatteryManager.EXTRA_PLUGGED, 0));
    }

    @Rule
    public ActivityScenarioRule<BatterySettingActivity> activityScenarioRule = new ActivityScenarioRule<>(BatterySettingActivity.class);


    @Test
    public void testStickBroadcast() {
        activityScenarioRule.getScenario().onActivity(activity -> {
            System.out.println("intentForStickyBroadcast=" + activity.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)));
        });
    }
}
@RunWith(RobolectrictTestRunner.class)
公共类电池设置活动测试{
{
ApplicationProvider.getApplicationContext().sendStickyBroadcast(新的意图(意图.动作\u电池\u已更改).putExtra(电池管理器.EXTRA\u级别,75).putExtra(电池管理器.EXTRA电池,0));
}
@统治
public ActivityScenarioRule ActivityScenarioRule=新建ActivityScenarioRule(BatterySettingActivity.class);
@试验
公共无效测试StickBroadcast(){
activityScenarioRule.getScenario().onActivity(活动->{
System.out.println(“intentForStickyBroadcast=“+activity.registerReceiver(null,新IntentFilter(Intent.ACTION\u电池更换));
});
}
}

您使用的是什么版本的Robolectric?在ShadowApplication中,我看到的代码看起来确实像是要处理粘性意图。哦,对了。。。我使用的是Robolectric版本3.3.1,您的测试看起来怎么样?