2016-05-08 6 views
2

Я пытаюсь написать тест для моего приложения Android, которое обменивается данными с облачным сервисом. Теоретически поток для испытания должен быть таким:Как сделать JUnit4 «Подождите» для асинхронного задания до завершения тестов

  1. Отправить запрос на сервер в рабочем потоке
  2. Дождитесь ответа от сервера
  3. Проверьте ответ, возвращаемый сервером

Я пытаюсь использовать класс IdlingResource Espresso для этого, но он не работает должным образом. Вот то, что я до сих пор

My Test:

@RunWith(AndroidJUnit4.class) 
public class CloudManagerTest { 

FirebaseOperationIdlingResource mIdlingResource; 

@Before 
public void setup() { 
    mIdlingResource = new FirebaseOperationIdlingResource(); 
    Espresso.registerIdlingResources(mIdlingResource); 
} 

@Test 
public void testAsyncOperation() { 
    Cloud.CLOUD_MANAGER.getDatabase().getCategories(new OperationResult<List<Category>>() { 
     @Override 
     public void onResult(boolean success, List<Category> result) { 
      mIdlingResource.onOperationEnded(); 
      assertTrue(success); 
      assertNotNull(result); 
     } 
    }); 
    mIdlingResource.onOperationStarted(); 
} 
} 

FirebaseOperationIdlingResource

public class FirebaseOperationIdlingResource implements IdlingResource { 

private boolean idleNow = true; 
private ResourceCallback callback; 


@Override 
public String getName() { 
    return String.valueOf(System.currentTimeMillis()); 
} 

public void onOperationStarted() { 
    idleNow = false; 
} 

public void onOperationEnded() { 
    idleNow = true; 
    if (callback != null) { 
     callback.onTransitionToIdle(); 
    } 
} 

@Override 
public boolean isIdleNow() { 
    synchronized (this) { 
     return idleNow; 
    } 
} 

@Override 
public void registerIdleTransitionCallback(ResourceCallback callback) { 
    this.callback = callback; 
}} 

При использовании с точки зрения Эспрессо в matchers тест выполнен правильно, ожидает активности, а затем проверить результат.

Однако простые методы утверждения JUNIT4 игнорируются, и JUnit не ждет завершения моей работы с облаком.

Возможно ли, что IdlingResource работает только с эспрессо-методами? Или я делаю что-то неправильно?

+0

Теоретически мышление, вы можете отправить запрос -что-то, как если бы работа выполнялась, отправляйте 'true' в противном случае' false' каждую секунду, и вы можете удерживать свое задание до тех пор, пока 'true' не будет отправлено с сервера с использованием синхронизированных методов. –

ответ

5

Я использую Awaitility для чего-то подобного.

Это очень хороший гид, вот основная идея:

Везде, где вам нужно ждать:

await().until(newUserIsAdded()); 

в другом месте:

private Callable<Boolean> newUserIsAdded() { 
     return new Callable<Boolean>() { 
      public Boolean call() throws Exception { 
        return userRepository.size() == 1; // The condition that must be fulfilled 
      } 
     }; 
} 

Я думаю, что этот пример очень похож к тому, что вы делаете, так что сохраните результат вашей асинхронной операции в поле и проверьте его в методе call().

+0

Это сработало! Ожидание - это вид библиотеки, которую я искал. Спасибо огромное ! –

+0

Рад, что это сработало для вас! – nasch

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