Как я могу написать модульный тест для этого асинхронного метода?

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

Протестированный код выглядит следующим образом:

public void doWork(){
        ExecutorService executor = Executors.newSingleThreadExecutor();
        FutureTask<TestVO> futureResult = null;

        futureResult = new FutureTask<TestVO>(new Callable<TestVO>() {
                public TestVO call() {
                    return testService.scan(_scan_params, finalProcess, _ywid, _logPath);
                }
            });

       executor.execute(futureResult);
       TestVO testVO = futureResult.get(0, TimeUnit.SECONDS);
       TestRepository.save(testVO);
}

Метод, который необходимо издеваться, выглядит следующим образом:

@Async("taskAccStepExecutor")
public TestVO scan(String params, String process, String ywid, String LogPath) {
       ......
       return testVO;
}

Я использовал testng/mokito в качестве основы для тестирования в своем проекте.

Я ожидаю, что смоделирую асинхронный поток и вернут собственный testVO. Эта проблема беспокоила меня в течение нескольких дней, и я надеюсь получить вашу помощь.


person keshuan_jeme    schedule 06.08.2020    source источник


Ответы (1)


Работая с предположением, что класс, который определяет метод doWork() (назовем этот класс Worker), каким-то образом внедряет testService, и вы можете контролировать, как это внедряется.

В этом случае, вероятно, будет достаточно, если вы создадите Worker с имитацией testService в своем модульном тесте. Добавьте, когда(testService.scan(anyString(), anyString(), anyString(), anyString()).thenReturn(new TestVO()) чтобы имитировать то, что вы ожидаете от службы. Затем вызовите метод doWork, как это кажется должен быть метод, который вы хотите протестировать. Затем убедитесь, что был вызван метод сканирования: verify(testService).scan(anyString(), anyString(), anyString(), anyString()). сохранены в вашей базе данных.

person Rudi Vankeirsbilck    schedule 08.08.2020