0

У меня есть LoginActivity, который загружает SplashFragment в onResume().Как издеваться над пользовательским ImageView для тестирования единицы измерения

Формат XML фрагмента всплеска содержит пользовательский ImageView, называемый RotatingImageView, который, как следует из названия, начинает вращать исходное изображение, как только он прикреплен к окну.

Теперь это вызывает проблемы, когда я пытаюсь написать единичный тест для LoginActivity с использованием ActivityInstrumentationTestCase2<LoginActivity>. Я пытаюсь запустить тесты на реальном устройстве (не в корне), а не на эмуляторе.

Звонок getActivity() вызывает действие, но из-за поворота изображения (который является анимацией кстати) эспрессо застревает. Я знаю, что эспрессо не любит анимацию. Я получаю исключения,

«эспрессо не может запустить намерение в течение 45 секунд. Возможно, основной поток не пошел простаивает в течение разумного периода времени? Там может быть анимация или что-то постоянно перекрашивать экран. Или активность выполняет сетевые вызовы при создании? См. Журнал датских журналов . Для вашей справки в последний раз, когда очередь событий простаивала до , запрос на запуск вашей активности был 1487296262885, и теперь в последний раз очередь простаивала: 1487296262885 Если эти числа совпадают, то ваша активность может зависеть от очереди событий ... »

Теперь, очевидно, проблема заключается в том, чтобы как-то остановить/издеваться над анимацией.

  1. Я уже отключил все параметры анимации из устройства -> Настройки -> Параметры разработчика, но до сих пор, когда деятельность начал я вижу вращение изображения таким образом, это не помогает.

  2. Я также изучил Disable animations for Espresso tests, но это тоже не помогло. Я мог бы делать это неправильно, но в любом случае это не помогает.

  3. Другим вариантом является запуск LoginActivity с использованием специального намерения, которое сообщает активности, что это запускается под тестированием, поэтому при загрузке фрагмента он отключает анимацию. Этот метод работает, но он не идеален, потому что он включает добавление кода в основной класс, который предназначен исключительно для тестирования.

Еще одно решение может быть издеваться RotatingImageView и ввести его в SplashFragment прежде чем он начнет загрузку. Я бы высмеял вызов startSpinningAnimation, поэтому, когда он загрузится в окно, он не запустит анимацию.

Мой вопрос: возможно ли? Могу ли я высмеивать и вводить этот обычай imageView в свой фрагмент каким-то образом, прежде чем сделать вызов getActivity()?

ответ

1

Да, возможно, вы можете создать класс под названием AnimationUtil, поместить свои методы анимации в этот класс и высмеять их во время теста.

public Animation getWhateverAnimation(int duration){ 
    RotateAnimation anim = new RotateAnimation(0f, 350f, 15f, 15f); 
    anim.setInterpolator(new LinearInterpolator()); 
    anim.setRepeatCount(Animation.INFINITE); 
    anim.setDuration(duration); 
    return anim; 
} 

и создать (не main пакет) с MockAnimationUtil что extendAnimationUtil в вашем androidTest пакете и переопределить и метод.

public Animation getWhateverAnimation(int duration){ 
    return super.getWhateverAnimation(0); 
} 
+0

Спасибо. Это работает. Я вытащил анимационную логику в отдельный класс из «CustomImageView». Фрагмент будет получать экземпляр этого из «MyApplication». В тестах я могу ввести экземпляр mock в экземпляр «MyApplication» перед запуском тестовой активности. Работает! – kdas