2015-06-03 1 views
1

У меня есть Activity, который должен начать AsyncTask, и я хотел бы протестировать это поведение с помощью Robolectric 3.0.Протестируйте, что AsyncTask был запущен с использованием Robolectric

До сих пор, я делаю это так, но я не очень счастлива с ним:

@Test 
public void testAsyncTaskIsStarted() { 
    activity = Robolectric.setupActivity(MyActivity.class); 
    Assert.assertTrue(ShadowApplication.getInstance().getBackgroundThreadScheduler().areAnyRunnable()); 
} 

Есть ли лучший способ сделать это?

Благодарим за помощь.

+0

Что касается меня, лучше проверить это фоновое задание и проверить что-то произошло. –

+0

Да, но вся цель модульного тестирования состоит в том, чтобы тестировать компоненты по отдельности. Таким образом, я не зависим от поведения задачи, особенно если моя AsyncTask выполняет HTTP-запросы или другие операции, которые я должен издеваться. –

+0

Ах, извините, я не понял, что вас не интересует результат задачи, а только интересует, что какой-то абстрактный код будет запущен в другом потоке. Еще более ясно, что он будет запущен поверх 'AsyncTask'. Я бы рекомендовал посмотреть на другой способ инъекций (Кинжал 2 - мой выбор) –

ответ

0

Я, наконец, сделал это, издеваясь над моим AsyncTask с Mockito. В моих Activity, я извлек свой AsyncTask как класс поле для того, чтобы иметь возможность издеваться его:

public void MyActivity extends Activity { 
    MyAsyncTask task; 

    public void onCreate (...) { 
     ... 
     if (task == null) 
      task = new MyAsyncTask(); 

     task.execute(...); 
     ... 
    } 

И в моих тестах:

MyAsyncTask asyncTaskMock = Mockito.mock(MyAsyncTask.class);  

@Test 
public void testAsyncTaskIsStarted() { 
    controller = Robolectric.buildActivity(MyActivity.class); 
    controller.get().task = asyncTaskMock; 
    controller.create().resume().visible(); 

    Mockito.verify(asyncTaskMock).execute(...); 
} 

Надеется, что это помогает.