2016-12-20 4 views
1

Код ниже не работает при работе в среде JUnit. Но он падает при запуске приложения. Я вижу журналы ошибок в консоли, но тесты отмечены как переданные.RxJava2 с JUnit: исключений, исключенных в тестах

@Test 
    public void test() { 
    Observable observable = Observable.error(new RuntimeException()); 
    observable.subscribe(); 
    } 

Итак, вопрос в том, как это произошло в JUnit. Потому что да, если что-то не работает в приложении, это хорошо, если он также не работает в модульных тестах :)

И в этом примере у меня есть прямой доступ к наблюдаемому. Но в моих реальных тестах у меня этого нет. Реальные наблюдаемые - это только внутренние детали тестируемых классов. Самое главное, что я могу сделать, это добавить планировщиков или что-то еще.

Итак, как сделать так, чтобы он не имел прямого доступа к наблюдаемому?

Кроме того, я только что проверил этот код не врезаться либо:

@Test 
    public void test() { 
    Observable observable = Observable.error(new RuntimeException()); 
    observable.subscribe(new Consumer() { 
     @Override 
     public void accept(Object o) throws Exception { 
     throw new RuntimeException(); 
     } 
    }, new Consumer<Throwable>() { 
     @Override 
     public void accept(Throwable throwable) throws Exception { 
     throw new RuntimeException(); 
     } 
    }); 
    } 
+2

Такие порядки больше не бросать синхронно в 2.x, но в конечном итоге в обработчике плагинов на наличие ошибок. По умолчанию обработчик печатает стек, поэтому вы видите ошибки, напечатанные на консоли, но не сбой при тестировании. В противном случае распространяются только фатальные исключения, такие как StackOverflowError. – akarnokd

+0

@akarnokd Спасибо, это интересно, тогда это RxJava2. Есть ли способ обнаружить такие ошибки и сделать тесты неудачными? –

+2

Вы должны разработать для этого. Также вы не должны бросать потребителя, и, если это возможно, используйте собственный пробный код вокруг проблемного кода внутри пользовательского onNext или лямбда. – akarnokd

ответ

3

Согласно akarnokd это RxJava2 конкретная проблема.

«Такие обычаи больше не синхронизируются в 2.x, а заканчиваются обработчиком плагинов для ошибок».

Это можно проверить, если какие-либо ошибки, был выброшен с этим кодом

public static List<Throwable> trackPluginErrors() { 
    final List<Throwable> list = Collections.synchronizedList(new ArrayList<Throwable>()); 

    RxJavaPlugins.setErrorHandler(new Consumer<Throwable>() { 
     @Override 
     public void accept(Throwable t) { 
      list.add(t); 
     } 
    }); 

    return list; 
} 
0

Использование TestSubscriber

Observable observable = Observable.error(new RuntimeException()); 
    TestSubscriber testSubscriber = TestSubscriber.create(); 

    observable.subscribe(testSubscriber); 

    testSubscriber.assertTerminalEvent(); 
    testSubscriber.assertError(RuntimeException.class); 
+0

Это выглядит хорошо, но, к сожалению, у меня нет доступа к наблюдаемому и подписываться() в моих реальных тестах. Я не тестирую наблюдаемые, я тестирую компоненты, состоящие из наблюдаемых. –

+0

И, я хочу проверить, что код реального абонента работает нормально, поэтому замена его TestSubscriber просто поражает цель. –

+0

Почему вы хотите проверить внутренние детали класса? Вы должны тестировать только публичные интерфейсы классов. –

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