Как мога да напиша единичен тест за този асинхронен метод?

Когато пиша модулни тестове за бизнес код, трябва да се подигравам на извиквания на асинхронни нишки и да върна симулиран резултат, който да запазя в базата данни. Не знам как да напиша единичен тестов код за този метод.

Тестваният код е както следва:

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 във вашия модулен тест. Добавете when(testService.scan(anyString(), anyString(), anyString(), anyString()).thenReturn(new TestVO()), за да се подиграете на това, което очаквате от услугата. След това извикайте метода doWork, тъй като изглежда бъде методът, който искате да тествате. След това проверете дали методът за сканиране е бил извикан: verify(testService).scan(anyString(), anyString(), anyString(), anyString()). Може също да потвърдите, че обектът TestVO е запазени във вашата база данни.

person Rudi Vankeirsbilck    schedule 08.08.2020