2016-09-09 6 views
1

Я пишу модульные тесты для Android-приложения, код которого я не должен менять. Я столкнулся с проблемой тестирования кода с использованием java.util.Timer. Я ищу способ заставить задачу выполнить немедленно, без необходимости ждать до запланированного времени. Поскольку он создан как локальный объект, я не могу издеваться над ним с Mockito.robolectric unit test android Timer

public void testedMethod() { 
    long time = 9999; 
    final Timer timer = new Timer() 

    timer.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      //do stuff 
     } 
    }, time); 
} 

@Test 
public void test() throws Exception { 
    testedObject.testedMethod(); 

    Thread.sleep(10000); 

    //verify that stuff was done 
} 

Я использую Robolectric (3.1), поэтому я попытался с помощью методов ShadowLooper и Robolectric классов, но безрезультатно. В настоящее время я должен использовать Thread.sleep(), но это довольно неудобно.

Есть ли способ заставить Timer для выполнения запланированных TimerTasks, как с помощью ShadowLooper.runToEndOfTasks() выполнить Runnables запланированных Handler?

ответ

1

Чтобы начать свою задачу сразу же, как класс Handler, вы можете создать свой собственный класс ShadowTimer для поддержки этого поведения. ShadowLooper работает только с задачами обработчика, а не с задачами таймера.

Вот основное объяснение, как создать свой собственный класс ShadowTimer http://robolectric.org/extending/

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

Handler handler = new Handler(); 
handler.postDelayed(runnable, 100);