2015-04-30 3 views
2

В представлении, которое я тестирую, есть анимация, и, похоже, это неправильно, когда я тестирую Robolectric. Анимация - это простой слайд с использованием Nineoldandroids для совместимости. Все отлично работает за пределы Robolectric, однако мое модульное тестирование происходит сбой с нулевым указателем:Nineoldandroids NullPointerException в AnimatorProxy с Robolectric

10:34:35.419 [DEBUG] [TestEventLogger]  java.lang.NullPointerException 
10:34:35.419 [DEBUG] [TestEventLogger]  at com.nineoldandroids.view.animation.AnimatorProxy.applyTransformation(AnimatorProxy.java:316) 
10:34:35.419 [DEBUG] [TestEventLogger]  at android.view.animation.Animation.getTransformation(Animation.java:870) 
10:34:35.420 [DEBUG] [TestEventLogger]  at org.robolectric.shadows.ShadowView$2.run(ShadowView.java:492) 
10:34:35.420 [DEBUG] [TestEventLogger]  at org.robolectric.util.Scheduler.runOrQueueRunnable(Scheduler.java:218) 
10:34:35.420 [DEBUG] [TestEventLogger]  at org.robolectric.util.Scheduler.postDelayed(Scheduler.java:73) 
10:34:35.421 [DEBUG] [TestEventLogger]  at org.robolectric.shadows.ShadowChoreographer.postCallbackDelayed(ShadowChoreographer.java:44) 
10:34:35.421 [DEBUG] [TestEventLogger]  at android.view.Choreographer.postCallbackDelayed(Choreographer.java) 
10:34:35.427 [DEBUG] [TestEventLogger]  at org.robolectric.shadows.ShadowView.setAnimation(ShadowView.java:487) 
10:34:35.429 [DEBUG] [TestEventLogger]  at android.view.View.setAnimation(View.java) 
10:34:35.431 [DEBUG] [TestEventLogger]  at com.nineoldandroids.view.animation.AnimatorProxy.<init>(AnimatorProxy.java:66) 
10:34:35.432 [DEBUG] [TestEventLogger]  at com.nineoldandroids.view.animation.AnimatorProxy.wrap(AnimatorProxy.java:38) 
10:34:35.432 [DEBUG] [TestEventLogger]  at com.nineoldandroids.animation.PreHoneycombCompat$14.get(PreHoneycombCompat.java:161) 
10:34:35.432 [DEBUG] [TestEventLogger]  at com.nineoldandroids.animation.PreHoneycombCompat$14.get(PreHoneycombCompat.java:153) 
10:34:35.432 [DEBUG] [TestEventLogger]  at com.nineoldandroids.animation.PropertyValuesHolder.setupSetterAndGetter(PropertyValuesHolder.java:510) 
10:34:35.433 [DEBUG] [TestEventLogger]  at com.nineoldandroids.animation.ObjectAnimator.initAnimation(ObjectAnimator.java:410) 
10:34:35.433 [DEBUG] [TestEventLogger]  at com.nineoldandroids.animation.ValueAnimator.setCurrentPlayTime(ValueAnimator.java:538) 
10:34:35.433 [DEBUG] [TestEventLogger]  at com.nineoldandroids.animation.ValueAnimator.start(ValueAnimator.java:928) 
10:34:35.433 [DEBUG] [TestEventLogger]  at com.nineoldandroids.animation.ValueAnimator.start(ValueAnimator.java:951) 
10:34:35.433 [DEBUG] [TestEventLogger]  at com.nineoldandroids.animation.ObjectAnimator.start(ObjectAnimator.java:385) 
10:34:35.433 [DEBUG] [TestEventLogger]  at com.nineoldandroids.animation.AnimatorSet.start(AnimatorSet.java:502) 

Если добавить проверку в моем коде только nineoldandroids использования для API < 11 и использование по умолчанию андроида родной анимации тест проходит просто хорошо. Из источника nineoldandroids я могу видеть, что это нулевой pointering на этой линии:

View view = mView.get(); 

где MView является mView = new WeakReference<View>(view);

Любые предложения, как обойти это в идеале из теста, а не мое приложение кода?

ответ

2

Что похоже на то, что анимация Nineoldandroid, которая анимирует элемент списка, выполняется с помощью петлителя UI/Main до того, как AnimationProxy полностью инициализирован. Это может быть из-за лучшее моделирование многопотоковости архитектуры Android в Robolectric 3.

Я решил это по телефону:

ShadowLooper.pauseMainLooper();

Размещение этого вызова перед любым способом, который может инициировать анимацию внутри Nineoldandroids.

Update:

Это вызывает больше трудностей для меня и обходной путь выше раздражает раскатать на каждый бит кода, который сделал анимацию, так что я раздвоенный и установил ее, очень небольшое изменение:

https://github.com/apinder/NineOldAndroids/commit/6d399685dc5b3932e3b806d4d7d2f27123e1ca36

+0

Удивительные вещи, спасибо! Извините, мне потребовалось некоторое время, чтобы вернуться к этому вопросу :) – vkislicins

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