2016-10-12 5 views
1

В настоящее время разрабатывается приложение для Android с использованием RxJava.Mocking Activity Lifecycle для RxJava в модульном тесте

я получил следующий фрагмент кода:

public Observable<Response<DTO>> getDTO(final BaseActivity activity, final long workorderId) { 
    return dtoService.getDTO(DTOId) 
      .subscribeOn(Schedulers.io()) 
      .compose(activity.bindUntilEvent(ActivityEvent.PAUSE)) 
      .observeOn(AndroidSchedulers.mainThread()); 
} 

(. Пожалуйста, не против именования объектов, просто поставить некоторые случайные имена, чтобы отразить то, что нужно делать)

I протестировать отдельные части кода. Более того, эти части не содержат метод .compose(). Теперь я попытался следующие:

@Mock 
private BaseActivity baseActivity; 

@Before 
public void setup() { 
    MockitoAnnotations.initMocks(this); 
} 

и

private BaseActivity baseActivity; 

@Before 
public void setup() { 
    baseActivity = Mock(BaseActivity.class); 
} 

Обе эти ситуации дают мне нулевой указатель: lifecycle == null (Что это, если я его отладки).

Как я обманываю или проверяю это каким-либо другим способом? (Кроме того, я не совсем понимаю, метод Compose(). Но я не могу показаться, чтобы найти какие-либо ресурсы, связанные с этим кодом)

(I при условии, что планировщики Android и RxJava, так что это не проблема)

Спасибо!

+0

Вы рассмотрели шпионить фактическую деятельность я хотел бы также предложить robolectric если вы модульное тестирование деятельность сам модульного тестирование не является предназначенный для этого. –

+0

Я проверил различные типы модульных испытаний на этом примере проекта, надеюсь, это помогло бы: http://github.com/mmirhoseini/fyber_mobile_offers –

+0

Но я не хочу проверять свою деятельность. Я просто хочу знать если метод возвращает наблюдаемый с ответом с правильным DTO. Вот почему я хочу издеваться над этим действием, потому что он не имеет к этому никакого отношения. Или, может быть, я просто не понимаю метод compose()? – Clemenz

ответ

0

Хорошо, так. Начнем с метода . Что он делает - применяет некоторую функцию трансформатора к вашему Observable, которую вы можете понимать как «объединить пользовательскую последовательность наблюдаемых методов (например, map, flatMap и т. Д.)». То есть вы можете использовать его для объединения .subscribeOn и .observeOn методов (more here). Поскольку вы используете RxLifecycle, вы можете просто перейти к исходному коду и посмотреть, what it does.

Если вы хотите использовать жизненный цикл деятельности в тестах, вы должны использовать Robolectric. Это даст вам полный контроль над созданием активности и управлением ее жизненным циклом. Это поможет с NPE. Вы просто настроить его и написать:

ActivityController controller = Robolectric.buildActivity(BaseActivity.class).create().start().resume(); 
Activity activity = controller.get(); 

// Not paused yet 
activityController.pause(); 
// Pause happened! Do something! 

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

+0

Уточнено намного больше. Благодаря! Если я правильно понял свой код (он был написан кем-то другим), вызов прекратится, если действие приостановлено? Иначе это будет продолжаться? Но проблема в том, что я действительно не хочу ничего делать с моей деятельностью. Есть ли способ издеваться над методом или активностью без RoboElectric? Я просто хочу знать, получаю ли я наблюдаемую спину с ответом . – Clemenz

+0

При активности приостановлено, да, оно выдаст 'onCompleted()', и вызов завершится (согласно документации). – aleien

+0

Об издевательстве - вы можете попробовать использовать 'Mockito.when (activity.getLifecycle()). ThenReturn (ActivityEvent.PAUSE) 'или что-то вроде этого (это псевдокод и не будет работать, я просто хотел показать подход) – aleien

Смежные вопросы