Есть ли способ приостановить юнит тест без блокировки потока - PullRequest
2 голосов
/ 08 декабря 2011

Я использую play 1.2.4 и пытаюсь настроить юнит-тест для проверки работы. Моя работа выполняется каждые 2 секунды и меняет состояние определенных объектов в зависимости от некоторых условий. Это то, что я использую для этого.

@Every("2s")
public class GameScheduler extends Job {
    public void doJob(){
        //Fetch of object from db and status change based on conditions happens here
    }
}

Теперь в моем модульном тесте я настраиваю эти условия, но я хочу, чтобы тест подождал, скажем, 3 секунды, прежде чем выбрать один из объектов установки, и выполнил Assert Equals для его состояния, чтобы проверить, хорошо ли это выполнено ... .

Если я использую

pause(3000);

или что-то вроде

try {
    Thread.sleep(3000);
} catch (InterruptedException e) {
    e.printStackTrace();
}

Тест останавливается, но работа также останавливается. Кажется, что работа и тест находятся в одном потоке. Есть ли способ приостановить тест, не останавливая работу? Что-то вроде метода await () в контроллере

Ответы [ 2 ]

3 голосов
/ 08 декабря 2011

Вам не нужно тестировать планировщик, потому что он должен работать (так как среда его обрабатывает).Вам нужно просто проверить, работает ли метод doJob.Итак, просто напишите такой тест:

GameScheduler job = new GameScheduler();
job.doJob();

// assert whatever you want here
0 голосов
/ 21 июня 2012

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

Например, у вас есть кластер приложений воспроизведения, которые используют общий набор конфигурации.Измените один конфиг в одном подчиненном устройстве, все остальные примут к сведению и сделают то же самое.Допустим, конфигурация хранится в memcached.Один полезный модульный тест состоит в том, чтобы вручную изменить некоторые настройки с помощью Cache.set, подождать, сколько времени потребуется для выполнения задания configurationObserver, а затем проверить, что внутренняя конфигурация обновлена.Это было бы еще более полезно, если бы была серия заданий по обновлению конфигурации и т. Д.

Чтобы сделать это, вы должны помнить, что игра в режиме DEV использует один поток (кстати, это помогает отладку, кстати),Вы можете просто добавить эту строку в ваш application.conf:% test.application.mode = prod, и у вас будет несколько потоков.

Позднее редактирование: кажется, что установка режима на prod на самом деле не помогаетв этом случае.Что помогает, так это: используйте магию «жду».

@Test
public void myTest() { 
    final Lock lock = new ReentrantLock();
    final Condition goAhead = lock.newCondition();
    /* Here goes everything you need to do before "pausing" */
    lock.lock();
    try {
        /**
         * Set whatever time limit you want/need 
         * You can also use notifiers like goAhead.signal(), from within another thread 
         */   
        goAhead.await(5, TimeUnit.SECONDS);
    } catch (InterruptedException e) {
        assertTrue(whateverINeedToTest);
    } finally {
        lock.unlock();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...