Как я могу написать модульный тест для этого асинхронного метода? - PullRequest
0 голосов
/ 06 августа 2020

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

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

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. Эта проблема беспокоит меня несколько дней, и я надеюсь получить вашу помощь.

1 Ответ

0 голосов
/ 08 августа 2020

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

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

...