Как выполнить модульное тестирование, чтобы ExecutorService порождал новый поток для задачи?

Как один модуль тестирует, что новый поток был создан для задачи Runnable при использовании ExecutorService?

По сути, у меня есть статический пул потоков для моего приложения.

public static final ExecutorService executorService = Executors.newCachedThreadPool();

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

Пул кэшированных потоков, кажется, работает лучше для меня. Проблема в том, что так какЕсли статические потоки кэшируются в течение 60 секунд, только первый тест будет порождать новый поток в пуле, в то время как последующие тесты будут повторно использовать этот поток.

Код юнит-теста:

public void testDoCallExecutesTaskInAnotherThread() {    
    final Client client = this.createClient();
    final ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) client.getExecutorService(); // gets the static thread pool
    final int initPoolSize = threadPoolExecutor.getPoolSize();
    final Response response = client.doCall();
    Assert.assertEquals(initPoolSize + 1, threadPoolExecutor.getPoolSize());
}

Советы о том, как заставить это работать, или другой подход в целом, будут оценены.

 Ben Simmons03 нояб. 2009 г., 20:18
Хороший вопрос. Этот конкретный клиент должен выполнить вызов веб-службы <b>асинхронно </ Б> так что он не удерживает объект, который его использует - проблема производительности в моем приложении. Я'я не жду ответа, я просто хочу убедиться, что задача, которая делает вызов веб-службы, была создана асинхронно.
 erickson03 нояб. 2009 г., 20:23
Тот'Это то, что я думал. Так что вы должны действительно проверить, является ли это "задержите [s] объект, который его использует ", То есть сколько времени это займет? Я могу реализовать doCall таким образом, что для возврата требуется два дня, но все равно заставляет исполнителя создать другой поток; Ваш юнит-тест все равно пройдет, даже если ваш критерий нарушен.
 erickson03 нояб. 2009 г., 20:09
Почему вас волнует, если клиент выполняет вызов в отдельном потоке? Я вижу заботу о таких вещах, как "Как долго это займет?" или же "эта операция правильно реагирует на прерывание ". Но в нынешнем виде это плохое применение модульного тестирования.

Ответы на вопрос(1)

Решение Вопроса

ДразнитьThreadFactory

  ThreadFactory mock = new CustomObservableThreadFactory();
  ExecutorService executorService = Executors.newCachedThreadPool(mock);
Вставьте ExecutorService в тестируемый класс как обычноНо используйтепользовательская ThreadFactory для создания кэшированного ThreadPool: ThreadFactory будет вызываться всякий раз, когда будет вызван новый поток. Затем вы можете отслеживать эти экземпляры по своему усмотрению, например, с помощью слушателя или счетчика.

Ваш ответ на вопрос