Mit Robolectric 3.3 versuche ich den Paket-Manager die richtigen Werte für queryIntentServices zurückgeben, so dass der Firebase Job Dispatcher funktioniert.Robolectric addResolveInfoForIntent funktioniert nicht
In meinem AndroidManifest.xml ich habe:
<service
android:name="com.jongla.soundmash.service.SoundMashService"
android:exported="false">
<intent-filter>
<action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
</intent-filter>
</service>
Und in meiner Test-Anwendungsklasse, die Robolectric ich gesetzt haben rufen:
val executeIntent = Intent("com.firebase.jobdispatcher.ACTION_EXECUTE")
executeIntent.setClassName(RuntimeEnvironment.application, "com.jongla.soundmash.service.SoundMashService")
Shadows.shadowOf(packageManager)
.addResolveInfoForIntent(executeIntent, ResolveInfo().apply { serviceInfo = ServiceInfo().apply { enabled = true } })
jedoch noch Firebase wirft diesen Fehler:
com.firebase.jobdispatcher.ValidationEnforcer$ValidationException: JobParameters is invalid: Couldn't find a registered service with the name
com.jongla.soundmash.service.SoundMashService. Is it declared in the manifest with the right intent-filter?
Der entsprechende Code im Firebase-Projekt ist unten. Es sieht wirklich einfach aus, also denke ich nicht, dass es ein Fehler auf ihrer Seite ist.
PackageManager pm = context.getPackageManager();
if (pm == null) {
return getMutableSingletonList("PackageManager is null, can't validate service");
}
final String msg = "Couldn't find a registered service with the name " + service
+ ". Is it declared in the manifest with the right intent-filter?";
Intent executeIntent = new Intent(JobService.ACTION_EXECUTE);
executeIntent.setClassName(context, service);
List<ResolveInfo> intentServices = pm.queryIntentServices(executeIntent, 0);
if (intentServices == null || intentServices.isEmpty()) {
return getMutableSingletonList(msg);
}
for (ResolveInfo info : intentServices) {
if (info.serviceInfo != null && info.serviceInfo.enabled) {
// found a match!
return null;
}
}
Mache ich etwas falsch mit meiner Verwendung von Robolectric?
Sie können Ihre Frage verbessern, um für andere Leser nützlich zu sein, wenn Sie Ihren Code bearbeiten, um die umschließende Klasse und Methode für den Java-Code anzuzeigen. –