Модуль проверки мощности Java тестирует метод, имеющий Thread.Sleep - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь выполнить модульное тестирование метода, который имеет вызов Thread.sleep.

public Boolean waitForUpscale(){
   String res = someObject.upTheResources();
   Thread.sleep(20000);
   Boolean status = someObject.checkForStatus();
   return status;
}

Во время тестирования этого теста также спит из-за Thread.sleep При тестировании я должен избегать перехода в спящий режим.

ОБНОВЛЕНИЕ:

Я добавил этот тест:

@Test
    public void downscaleTest() throws Exception {
        when(someservice.downScaleResources()).thenReturn("DONE");
        PowerMockito.mockStatic(Thread.class);
        doNothing().when(Thread.class, "sleep", anyLong());
        Boolean res = Whitebox.invokeMethod(myController, "downscaleALL");

        assertTrue(res);
    }

Когда я отлаживаю это, это работает. Но когда я запускаю тест в обычном режиме, он терпит неудачу, выдавая следующее исключение:

0 matchers expected, 1 recorded:

-> at com.mypackage.controller.MyController.downscaleALL(MyControllerTest.java:265)

This exception may occur if matchers are combined with raw values:
    //incorrect:
    someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(anyObject(), eq("String by matcher"));

For more info see javadoc for Matchers class.



Добавление метода downScaleAll

private Boolean downscaleALL() {
    try {
        String downScaleResources = someservice.downScaleResources();
        if (downScaleResources.equals("DONE")) {
            Thread.sleep(20000); // 20s
            log.info("DOWNSCALING THE RESOURCES NOW");
            return true;
        }

        return false;
    } catch (Exception e) {
        log.error("Error while downscaling the resources");
        log.error(e.toString());
        return false;
    }
}

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

Я согласен с тем, что упомянул @Elevate, вы не должны высмеивать типы, которые вам не принадлежат. Но если вам все еще нужно это сделать, вы можете сделать это так

@RunWith(PowerMockRunner.class)
@PrepareForTest({<ClassWherewaitForUpscaleFunctionisLocated>.class, Thread.class})
public class Mytest {
    @Test
    public void testStaticVoid() throws Exception {

        PowerMockito.mockStatic(Thread.class);
        doNothing().when(Thread.class, "sleep", anyLong());
        .........
    }
}
1 голос
/ 10 октября 2019

Вы должны только макетировать свои типы , поэтому, если вы хотите смоделировать вызов на Thread.sleep(), вы должны извлечь его в свой тип (например, ThreadSleeper) и, следовательно, можете имитировать. Еще лучше, переписать, чтобы избежать сна, если можете. Сны, как правило, являются запахом кода (срезающие углы).

...