Какой оператор будет выполняться первым в этом случае? - PullRequest
0 голосов
/ 03 мая 2018

Я пытался заставить тест Junit дождаться завершения задачи Async, но он застрял. Предположим, у нас есть такой класс

class MyViewModel{

 public void doSomething(){

    new Task(){

      void inBackground(){
         model.getData(); //Executes for 4000 ms max

      void onMainThread(){
         displayData();
      } 


    } 

 }

  void displayData(){

  } 
}

Вот мой метод испытаний

@UiThreadTest
@Test
public void someTest() throws Exception{
   MyViewModel myViewModel = Mockito.spy(new MyViewModel());
   myViewModel.doSomething();
   Thread.sleep(5000);
   verify(myViewModel).displayData();          
} 

Проблема, с которой я сталкиваюсь, состоит в том, что оператор verify вызывается раньше, чем displayData во внутреннем классе MyViewModel, и контрольный пример не пройден. Как мне решить эту проблему? Любой другой способ тестирования той же функциональности также приветствуется.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Я решил проблему с помощью обработчика.

В методе setUp тестового класса я создал обработчик.

@UiThreadTest
@Before
public void setUp() throws Exception {
    handler = new Handler();
}

Обратите внимание, что я использую аннотацию @UiThreadTest для метода, чтобы связать обработчик с UiThread.

В тестовом методе я использовал обработчик для запуска кода модели представления в потоке пользовательского интерфейса и методов проверки в другом потоке. Обратите внимание, что я удалил аннотацию @UiThreadTest здесь.

@Test
public void testThatInspectionsAreFetchedWhenVesselIdIsSet() throws Exception{
    MyViewModel myViewModel = Mockito.spy(new MyViewModel());
    handler.post(() -> myViewModel.doSomething());
    Thread.sleep(5000);
    verify(myViewModel).displayData(); 
  } 

Теперь метод теста работает отлично!

0 голосов
/ 03 мая 2018

Я бы предпочел использовать CountDownLatch

final CountDownLatch signal = new CountDownLatch(1);


   public void someTest() throws Exception{
     MyViewModel myViewModel = Mockito.spy(new MyViewModel());
     myViewModel.doSomething();
     // It will wait either 5 secs or your countDown signal from 
     //postexecute from task
     signal.await(5, TimeUnit.SECONDS);
     verify(myViewModel).displayData();          
    }

Вы также должны позвонить signal.countDown() с вашего пост-выполнения. Если вы не хотите ждать 5 секунд и просто хотите убедиться, что проверка запускается только после завершения фонового процесса, не указывайте никаких параметров в signal.await()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...