2

Я хочу проверить метод, который выполняется в AsyncTask. Я уже издевался над всеми методами внутри. Что у меня есть -Обратный вызов Robolectric AsyncTask

  1. Статический метод, который получает все необходимые параметры и выполняет новую функцию AsyncTask(). ExecuteOnExecutor();
  2. В onPostExecute() Я вызываю обратный вызов с результатом.

Для теста я использую:

testCompile 'junit:junit:4.12' 
testCompile "org.robolectric:robolectric:3.2.2" 
testCompile "org.powermock:powermock-module-junit4:1.6.4" 
testCompile "org.powermock:powermock-module-junit4-rule:1.6.4" 
testCompile "org.powermock:powermock-api-mockito:1.6.4" 
testCompile "org.powermock:powermock-classloading-xstream:1.6.4" 

Но обратного вызова не вызывается. Пример:

@RunWith(RobolectricTestRunner.class) 
    @Config(constants = BuildConfig.class, sdk = 24, 
      application = StubApplicationClass.class) 
    @PowerMockIgnore({"org.mockito.", "android.*"}) 
    @PrepareForTest(BaseHttpClient.class) 

    @SuppressStaticInitializationFor("io.realm.internal.Util") 
    public class GetDataTest { 

     @Rule 
     public PowerMockRule rule = new PowerMockRule(); 
     .................................... 

     @Test 
     public void getDataTest() throws Exception { 
     System.out.println("started"); 
     BaseAsyncClient.doAsync(UserPublicDataTable, Actions, 
       list, new IHttpResponse<String>() { 
        @Override 
        public void httpResponse(@Nullable String response) { 
         assertNotNull(response); System.out.println("onPostExecute()"); 
        } 
       }); 
     System.out.println("finished"); 
    } 

onPostExecute - никогда не печатается.

Когда я зову:

Robolectric.flushBackgroundThreadScheduler(); 

я получаю исключение:

java.lang.NullPointerException 
    at org.robolectric.Robolectric.getBackgroundThreadScheduler(Robolectric.java:193) 
    at org.robolectric.Robolectric.flushBackgroundThreadScheduler(Robolectric.java:200) 

Как я могу проверить AsyncTask с robolectric, powermock?

Update:

Как я вижу ShadowApplication.getInstance() == null, поэтому я получаю NPE исключение, когда вызовы 'flushBackgroundThreadScheduler.

Я создал custom runner to create custom application, но он по-прежнему не имеет значения.

Чтобы исправить NPE в Заявке мигрировали:

testCompile "org.robolectric:robolectric:3.0" 

UPDATE:

Когда я создаю AsyncTask в @Test - это работает

new AsyncTask() { 
     @Override 
     protected Object doInBackground(Object[] params) { 
      System.out.println("empty async task"); 
      return null; 
     } 
    }.execute(); 
    ShadowApplication.runBackgroundTasks(); 
    Robolectric.flushBackgroundThreadScheduler(); 

Поэтому проблема при создании задачи с ' static 'метод

ответ

0

Мне удалось решить эту проблему с небольшим обходом:

  1. понижение версии до testCompile "org.robolectric: robolectric: 3,0"
  2. вызовов асинхронной тас новый AsyncTask.execute()
  3. вызовов ShadowApplication.executeBackgroundTasks();
  4. Сон в фоновом режиме Thread.sleep (1000);
  5. Выполнение задач с передний план, ShadowScheduler

К сожалению, для этого необходимо подождать, пока фоновый поток выполняется.Я также не нашел способ заменить фоновый поток на главный.

В конце концов, я перешел из AsyncTask в RxJava. Там, с помощью методов по умолчанию я заменяю пул потоков исполнителя с тем же выполнением потока:

compile 'io.reactivex.rxjava2:rxandroid:2.0.1' 
compile 'io.reactivex.rxjava2:rxjava:2.0.1' 
RxJavaPlugins.setIoSchedulerHandler(new Function<Scheduler, Scheduler>() { 
      @Override 
      public Scheduler apply(Scheduler scheduler) throws Exception { 
       return ImmediateThinScheduler.INSTANCE; 
      } 
     }); 

Schedulers.io() является пул потоков исполнителя, я заменю его с тем же нитями исполнителем ImmediateThinScheduler.INSTANCE