2017-06-13 1 views
2

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?

+0

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. –

Antwort

2

meine eigene Frage zu beantworten ... der anrufende Code muss in onCreate und nichtbeforeTest sein - dann funktioniert es ganz gut!

+0

wahrscheinlich kann der Code onResume() gehen, die besser sein wird, nicht wahr? –