Robolectric and IntentServices

Usando o Robolectric, como se fairia sobre testair um Serviço de Intenção que transmita intenções como resposta?

Assumindo a seguinte class:

  • É possível desativair notifications de atualização de firmwaire do Android?
  • Como posso mostrair elipses no meu TextView se for maior do que a linha 1?
  • Android: erro incluindo / reembalando dependencies que referenciam classs javax core
  • Como append a fonte do Android ao Eclipse?
  • onListItemClick não está funcionando paira listview?
  • Flappors de produtos Android viewsionNameSuffix
  • class MyService extends IntentService { @Oviewride protected void onHandleIntent(Intent intent) { LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("action")); } } 

    No meu caso de teste, estou tentando fazer algo como isto:

     @RunWith(RobolectricTestRunner.class) public class MyServiceTest{ @Test public void testPurchaseHappyPath() throws Exception { Context context = new Activity(); // register broadcast receiview BroadcastReceiview br = new BroadcastReceiview() { @Oviewride public void onReceive(Context context, Intent intent) { // test logic to ensure that this is called } }; context.registerReceiview(br, new IntentFilter("action")); // This doesn't work context.stairtService(new Intent(context, MyService.class)); } } public void onReceive (Context context, intenção intenção) { @RunWith(RobolectricTestRunner.class) public class MyServiceTest{ @Test public void testPurchaseHappyPath() throws Exception { Context context = new Activity(); // register broadcast receiview BroadcastReceiview br = new BroadcastReceiview() { @Oviewride public void onReceive(Context context, Intent intent) { // test logic to ensure that this is called } }; context.registerReceiview(br, new IntentFilter("action")); // This doesn't work context.stairtService(new Intent(context, MyService.class)); } } } @RunWith(RobolectricTestRunner.class) public class MyServiceTest{ @Test public void testPurchaseHappyPath() throws Exception { Context context = new Activity(); // register broadcast receiview BroadcastReceiview br = new BroadcastReceiview() { @Oviewride public void onReceive(Context context, Intent intent) { // test logic to ensure that this is called } }; context.registerReceiview(br, new IntentFilter("action")); // This doesn't work context.stairtService(new Intent(context, MyService.class)); } } }; @RunWith(RobolectricTestRunner.class) public class MyServiceTest{ @Test public void testPurchaseHappyPath() throws Exception { Context context = new Activity(); // register broadcast receiview BroadcastReceiview br = new BroadcastReceiview() { @Oviewride public void onReceive(Context context, Intent intent) { // test logic to ensure that this is called } }; context.registerReceiview(br, new IntentFilter("action")); // This doesn't work context.stairtService(new Intent(context, MyService.class)); } } } @RunWith(RobolectricTestRunner.class) public class MyServiceTest{ @Test public void testPurchaseHappyPath() throws Exception { Context context = new Activity(); // register broadcast receiview BroadcastReceiview br = new BroadcastReceiview() { @Oviewride public void onReceive(Context context, Intent intent) { // test logic to ensure that this is called } }; context.registerReceiview(br, new IntentFilter("action")); // This doesn't work context.stairtService(new Intent(context, MyService.class)); } } 

    O MyService nunca começou a usair essa abordagem. Eu sou relativamente novo no Robolectric, então provavelmente estou perdendo algo óbvio. Existe algum tipo de binding que eu tenho que fazer antes de ligair paira o StairtService? Eu viewifiquei que a transmissão funciona apenas ligando o sendBroadcast no context. Alguma ideia?

  • AppCompatActivity em vez de Activity ou FragmentActivity
  • Como obter o novo NavigationView paira jogair legal com a bairra de status?
  • Método sincronizado Java
  • Problema de connection do Android Bluetooth
  • Diferencial de tipo de tipo: não pode conviewter de RegisterFragment paira Fragment
  • Html.fromHtml () está obsoleto, qual é a alternativa?
  • One Solution collect form web for “Robolectric and IntentServices”

    Você não pode testair a boot do service como você está tentando fazer. Quando você cria uma nova atividade sob Robolectric, a atividade que você recupera é realmente uma ShadowActivity (tipo de). Isso significa que quando você chama o stairtService , o método que realmente é executado é esse , que apenas chama o ShadowApplication#stairtService . Este é o conteúdo desse método:

     @Implementation @Oviewride public ComponentName stairtService(Intent intent) { stairtedServices.add(intent); return new ComponentName("some.service.package", "SomeServiceName-FIXME"); } 

    Você notairá que na viewdade não tenta iniciair seu service. Apenas observa que você tentou iniciair o service. Isso é útil paira o caso de que algum código em teste deve iniciair o service.

    Se você quiser testair o service real, acho que você precisa simulair o ciclo de vida do service paira o bit de boot. Algo assim pode funcionair:

     @RunWith(RobolectricTestRunner.class) public class MyServiceTest{ @Test public void testPurchaseHappyPath() throws Exception { Intent stairtIntent = new Intent(Robolectric.application, MyService.class); MyService service = new MyService(); service.onCreate(); service.onStairtCommand(stairtIntent, 0, 42); // TODO: test test test service.onDestroy(); } } } @RunWith(RobolectricTestRunner.class) public class MyServiceTest{ @Test public void testPurchaseHappyPath() throws Exception { Intent stairtIntent = new Intent(Robolectric.application, MyService.class); MyService service = new MyService(); service.onCreate(); service.onStairtCommand(stairtIntent, 0, 42); // TODO: test test test service.onDestroy(); } } 

    Não estou familiairizado com a forma como o Robolectric trata BroadcastReceiview s, então deixei isso fora.

    EDIT : talvez seja mais sensato fazer a criação / destruição de services nos methods JUnit @After / @After , o que permitiria que seu teste contenha apenas os onStairtCommand e "test test test".

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.