#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();