Как издеваться над executorService.submit () - PullRequest
0 голосов
/ 29 января 2019

Как я могу издеваться над executorService.submit () в приведенном ниже сценарии.Я должен издеваться

cacheController.someMethod ();но при вызове метода submit создается поток и cacheController.someMethod ();никогда не вызывается на тестовый класс.

@Autowired
CacheController cacheController;
protected static final ExecutorService EXECUTOR = Executors.newFixedThreadPool(1);

EXECUTOR.submit(() -> {
        try {
            cacheController.someMethod();
        } catch (Exception e) {
            e.printStackTrace();
        }
    });

1 Ответ

0 голосов
/ 29 января 2019

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

protected static final ExecutorService EXECUTOR = Executors.newFixedThreadPool(1);

Чтобы проверить это, вам потребуется использовать темную магию PowerMock (ito), чтобы получить контроль над этимвызов статического метода newFixedThreadPool(1) здесь.Теоретически, это хорошо, и посмотрите, см., Например, здесь .

Но: обычно, когда вы проводите достойное модульное тестирование в средах на базе Spring, вы, вероятно, уже используете другого тестового прогона, чтобы заставить эту вещь @AutoWired работать в вашей тестовой настройке.Добавление PowerMock (ito) делает это намного более сложным и подверженным ошибкам.

Таким образом, real ответ таков: переделайте свой дизайн, чтобы не полагалсяна этом статическом вызове метода.Если вы превратите эту вещь в нормальное поле, вы сможете использовать «стандартные» механизмы инъекции мокито, как указано ниже .

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

...