android, как модульно протестировать приемник вещания, который использует doAsync()

#unit-testing #broadcastreceiver #android-unit-testing

Вопрос:

в приложении для Android используйте Broadcastreceiver для обработки щелчка уведомления.

 public class NotificationReceiver extends BroadcastReceiver {  public void onReceive(final Context context, final Intent intent) {    final PendingResult asyncResult = goAsync();  ExecutorService executor = Executors.newSingleThreadExecutor();  asycTask(executor, new Runnable() {  @Override  public void run() {  handleAction(context, intent); //a length process  asyncResult.finish(); //lt;=== unit test throws exception, asyncResult is null  }  });   }   @VisibleForTesting  void asycTask(ExecutorService executor, final Runnable task) {  try {  executor.execute(task);  } catch (Throwable ex) {}  } }  

в модульном тесте

 @Test public void test_{    NotificationReceiver receiver = new NotificationReceiver();  final CountDownLatch latch = new CountDownLatch(1);  receiver.onReceive(application, intent);  latch.await(10, TimeUnit.SECONDS);  // verify  // ... ... }  

но это вызывает исключение, потому asyncResult что значение равно нулю.

Как проверить, когда он использует doAsync()?

Ответ №1:

в каком-то смысле, должно быть что-то получше.

 BroadcastReceiver.PendingResult pendingResultMock =   mock(BroadcastReceiver.PendingResult.class);  NotificationReceiver receiverSpy = spy(new NotificationReceiver());  doReturn(pendingResultMock).when(receiverSpy).goAsync();