Исключение при приведении Binder к LocalBinder в тестировании JUnit с Robolectric. Как написать для него модульный тест? - PullRequest
0 голосов
/ 12 января 2019

Версии, которые я использую-
скомпилируйте 'org.robolectric: robolectric: 2.4' Версия Android 2.3.3

Контрольный пример из тестового файла.

    @Test
    public void onStartTest() throws Exception{    
        IMMMDialogPopup  immmDialogPopup = mock(IMMMDialogPopup.class);
        objMIPDialogActivity.setDialogPopup(immmDialogPopup);

        ComponentName expectedComponentName = new ComponentName(objMMMDialogActivity.getPackageName(),MIPService.class.getName());
        Binder expectedBinder = new Binder();

        ShadowApplication shadowApplication = Robolectric.getShadowApplication();
        shadowApplication.setComponentNameAndServiceForBindService(expectedComponentName,expectedBinder);

        objMMMDialogActivity.onStart();     
      }

Фактическая реализация для проверки. mConnection является объектом ServiceConnection.Call bindService (), затем он переходит к onServiceConnected () из ServiceConnection.

 @Override
    protected void onStart() {
        super.onStart();
bindService(new Intent(this, MIPService.class), mConnection, Context.BIND_AUTO_CREATE); 
    }

Вызовите метод ServiceConnection onServiceConnected (), из которого он генерирует исключение при приведении Binder к локальному binder. Это дает исключение в строке "MIPService.LocalBinder binder = (MIPService.LocalBinder) service;"

  private ServiceConnection mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName className,
                                       IBinder service) {
            if(dialogPopup != null) {
                MIPService.LocalBinder binder = (MIPService.LocalBinder) service;
                mipService = binder.getService();
                mipService.registerListener(MMMDialogActivity.this);
                showPopup(MMMDialogActivity.this.dialogPopup.getDialog(), false, centerInParent);
                mBound = true;
            }
        }

Исключение -

It jumps to Scheduler.class and throws exception and hit in  this.isExecutingRunnable = false; 
  private void runOrQueueRunnable(Runnable runnable, long scheduledTime) {
        if(this.isExecutingRunnable) {
            this.queueRunnableAndSort(runnable, scheduledTime);
        } else {
            this.isExecutingRunnable = true;
            try {
                runnable.run();
            } finally {
                this.isExecutingRunnable = false;
            }

        }
...