Robolectric und IntentServices
Mit Robolectric, wie würde man das testen ein IntentService, dass die Sendungen Absichten als Antwort?
Vorausgesetzt, die folgenden Klasse:
class MyService extends IntentService {
@Override
protected void onHandleIntent(Intent intent) {
LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("action"));
}
}
In meinem test-Fall, ich bin versucht zu tun so etwas wie dieses:
@RunWith(RobolectricTestRunner.class)
public class MyServiceTest{
@Test
public void testPurchaseHappyPath() throws Exception {
Context context = new Activity();
//register broadcast receiver
BroadcastReceiver br = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//test logic to ensure that this is called
}
};
context.registerReceiver(br, new IntentFilter("action"));
//This doesn't work
context.startService(new Intent(context, MyService.class));
}
}
MyService wird nie gestartet, mit diesem Ansatz. Ich bin relativ neu auf Robolectric, also ich bin wahrscheinlich etwas fehlt offensichtlich. Gibt es irgendeine Art von Bindung, die ich zu tun haben, vor dem Aufruf von startService? Ich habe festgestellt, dass Rundfunk arbeitet und einfach mitgehen sendBroadcast auf den Kontext an. Irgendwelche Ideen?
- Ich habe nicht eine konkrete Lösung für dich aber ich glaube, dass Sie zu verhöhnen, die broadcast-receiver mit mockito nennen zu können onReceive in dir-code. Oder der einfachere Weg wäre, zu extrahieren, die Logik von onReceive in einen separaten test-Fall.
- Der broadcast receiver ist wirklich gut arbeiten. Wie gesagt, am Ende der post oben aufrufenden Kontext.sendBroadcast bekommt in onReceive. Es ist die service-Initialisierung, die ich nicht sehen, geschieht.
- hast du eine Lösung finden? Ich stehe vor dem gleichen problem versuchen zu testen, ein
IntentService
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht testen Sie die service-Initialisierung, wie Sie zu tun versuchen. Wenn Sie eine neue Aktivität erstellen unter Robolectric, die Aktivität, die Sie zurück bekommen, ist eigentlich ein
ShadowActivity
(Art). Das bedeutet, dass beim AufrufstartService
, die Methode, die tatsächlich hingerichtet wird, ist diese eine, die nur Anrufe inShadowApplication#startService
. Dies ist der Inhalt der Methode:Werden Sie feststellen, dass es nicht wirklich versuchen, starten Sie den Dienst an allen. Es nur Hinweise, dass Sie versucht, den Dienst zu starten. Dies ist nützlich für den Fall, dass einiger code unter test sollte den Dienst zu starten.
Wenn Sie testen möchten, die den eigentlichen Dienst, ich glaube, Sie brauchen, um zu simulieren, den service-Lebenszyklus bei der Initialisierung bit. So etwas wie dies funktionieren könnte:
Ich bin nicht vertraut mit, wie Robolectric behandelt
BroadcastReceiver
s, also habe ich es weggelassen.BEARBEITEN: Es macht vielleicht Sinn, noch mehr zu tun, die service-Erstellung/Zerstörung in JUnit
@Before
/@After
Methoden, die es erlauben würde, Ihre Prüfung zu enthalten nur dieonStartCommand
und "test test test" - bits.