Intereting Posts
Ok Google-подобный слушатель горячего слова Не удается переопределить ресурс xml библиотеки с ресурсом png в приложении? Рамка аннотаций Android, похоже, ничего не генерирует Android list view setOnItemClickListener не работает Как объединить несколько изображений в одно изображение в Android? Дождитесь разрешения пользователя Может ли WindowBackground быть размещен ниже строки состояния и над навигационной панелью? Как программно установить несколько imeOptions Добавление изображения в приложение для ношения Android – начинающий Изображение фонового изображения Android Как открыть или расширить строку состояния через намерение? Как выполнить тест, который проверяет надежность подключения к Интернету Как интегрировать opencv-менеджер в приложение для Android Как предотвратить автоматическое восстановление Retrofit после 302 Firebase: при обработке запроса произошла неизвестная ошибка. Попробуй еще раз.

Тестирование узла с помощью RxJava CompositeSubscription

Я хотел бы создать тест для моего класса Presenter, но у меня возникают проблемы с экземпляром CompositeSubscription внутри самого Presenter. Когда я запускаю тест, я получаю эту ошибку:

java.lang.NullPointerException at rx.subscriptions.CompositeSubscription.add(CompositeSubscription.java:60) at com.example.Presenter.addSubscription(Presenter.java:67) at com.example.Presenter.getGummyBears(Presenter.java:62) 

Это примерно мой класс Presenter:

 public class Presenter { CompositeSubscription compositeSubscription = new CompositeSubscription(); //creation methods... public void addSubscription(Subscription subscription) { if (compositeSubscription == null || compositeSubscription.isUnsubscribed()) { compositeSubscription = new CompositeSubscription(); } compositeSubscription.add(subscription); } public void getGummyBears() { addSubscription(coreModule.getGummyBears()); } } 

CoreModule – это интерфейс (часть другого модуля), и есть еще один класс CoreModuleImpl, в котором расположены все модифицированные API-вызовы и их преобразование в Подписки. Что-то вроде:

 @Override public Subscription getGummyBears() { Observable<GummyBears> observable = api.getGummyBears(); //a bunch of flatMap, map and other RxJava methods return observable.subscribe(getDefaultSubscriber(GummyBear.class)); //FYI the getDefaultSubscriber method posts a GummyBear event on EventBus } 

Теперь я хочу проверить метод getGummyBears() . Мой метод тестирования выглядит следующим образом:

 @Mock EventBus eventBus; @Mock CoreModule coreModule; @InjectMock CoreModuleImpl coreModuleImpl; private Presenter presenter; @Before public void setUp() { presenter = new Presenter(coreModule, eventBus); coreModuleImpl = new CoreModuleImpl(...); } @Test public void testGetGummyBears() { List<GummyBears> gummyBears = MockBuilder.newGummyBearList(30); //I don't know how to set correctly the coreModule subscription and I'm trying to debug the whole CoreModuleImpl but there are too much stuff to Mock and I always end to the NullPointerException presenter.getGummyBears(); //I'm getting the "null subscription" error here gummyBears.setCode(200); presenter.onEventMainThread(gummyBears); verify(gummyBearsView).setGummyBears(gummyBears); } 

Я уже видел много примеров тестов из разных проектов, но никто не использует этот подход к подписке. Они просто возвращают Observable, который потребляется непосредственно в презентаторе. И в этом случае я знаю, как должен быть написан тест.

Каков правильный способ проверить мою ситуацию?

Похоже, coreModule.getGummyBears() возвращает null. Просто переходите к отладке, и это должно быть довольно ясно. При использовании насмешливых фреймворков вы можете получить null, возвращенный из вызовов метода на издеваемом объекте, когда вы не указали, что вызов метода должен возвращать на этом издеваемом объекте.