2016-03-09 2 views
1

Давайте предположим, что у меня есть метод, как этотTest Unit для ScheduledThreadPoolExecutor

public void scheduleCleanup(String parameter) { 
    final SomeObject someObject = new SomeObject(parameter); 
    ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1); 
    executor.schedule((Runnable)() -> cleanupService.startCleanup(someObject), 
       CLEANUP_TIMEOUT_SEC, TimeUnit.SECONDS); 
} 

, что означает, что cleanupService.startCleanup(someObject) вызывается после CLEANUP_TIMEOUT_SEC который фактически наступающем из некоторого файла свойств.

Для меня очень ясно, что я могу создать SomeObject и написать модульный тест для cleanupService.startCleanup(someObject), но что мне делать с помощью метода scheduleCleanup?

  1. Я предполагаю, что мне нужно издеваться над этим, но как вы это делаете в этом случае?
  2. Можно ли избежать насмешек и что это лучший способ в этом случае?

ответ

1

Я думаю, вы хотите избежать использования/вызова ScheduledThreadPoolExecutor в своих модульных тестах. Я хотел бы заменить ScheduledThreadPoolExecutor с ScheduledExecutorService и его вводят в класс:

@Inject ExecutorService executor; 

public void scheduleCleanup(String parameter) { 
    final SomeObject someObject = new SomeObject(parameter); 
    executor.schedule((Runnable)() -> cleanupService.startCleanup(someObject), 
      CLEANUP_TIMEOUT_SEC, TimeUnit.SECONDS); 
} 

Тогда вы можете просто проверить, что executor.schedule(Runnable, long, TimeUnit) был назван в соответствующих местах.

+0

Это полезно для модульного тестирования метода scheduleCleanup, но, если я не читаю его неправильно, это не то, что задает вопрос – blgt

+0

@blgt Итак, что он спрашивает? –

+0

Тестирование 'cleanupService.startCleanup', что бы это ни было. Возможно, ОП может прояснить – blgt