Подтвердить что ты не робот

Как мне высмеять статический метод, который возвращает void с помощью PowerMock?

У меня есть несколько статических методов использования в моем проекте, некоторые из них просто передают или генерируют исключение. Существует множество примеров того, как издеваться над статическим методом, который имеет тип возврата, отличный от void. Но как я могу издеваться над статическим методом, который возвращает void только "doNothing()"?

В не-void версии используются следующие строки кодов:

@PrepareForTest(StaticResource.class)

...

PowerMockito.mockStatic(StaticResource.class);

...

Mockito.when(StaticResource.getResource("string")).thenReturn("string");

Однако если применяется к StaticResources, который возвращает void, компилятор будет жаловаться, что when(T) не применим для void...

Любые идеи?

Обходной путь, вероятно, состоял бы в том, чтобы все статические методы возвращали некоторые Boolean для успеха, но мне не нравятся обходные пути.

4b9b3361

Ответ 1

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

// the stub of the static method
doNothing().doThrow(Exception.class).when(StaticResource.class);
StaticResource.getResource("string");

// the use of the mocked static code
StaticResource.getResource("string"); // do nothing
StaticResource.getResource("string"); // throw Exception

Благодаря замечанию Мэтта Лахмана, обратите внимание, что если ответ по умолчанию не изменяется в момент создания макета, то макет ничего не сделает по умолчанию. Следовательно, запись следующего кода эквивалентна тому, чтобы не писать его.

doNothing().doThrow(Exception.class).when(StaticResource.class);
StaticResource.getResource("string");

Хотя это, как говорится, может быть интересно для коллег, которые прочтут тест, который вы ничего не ожидаете для этого конкретного кода. Конечно, это можно адаптировать в зависимости от того, как воспринимается понятность теста.


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

Вообще говоря, если вам нужно издеваться над частным или статическим методом, то этот метод слишком много и должен быть экстернализирован в объекте, который будет введен в тестируемый объект.

Надеюсь, что это поможет.

Привет

Ответ 2

Вы можете заглушить статический метод void следующим образом:

PowerMockito.doNothing().when(StaticResource.class, "getResource", anyString());

Хотя я не уверен, почему вы будете беспокоиться, потому что, когда вы вызываете mockStatic (StaticResource.class), все статические методы в StaticResource по умолчанию обрезаются

Более полезно, вы можете записать значение, переданное в StaticResource.getResource(), как это:

ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
PowerMockito.doNothing().when(
               StaticResource.class, "getResource", captor.capture());

Затем вы можете оценить String, которая была передана в StaticResource.getResource следующим образом:

String resourceName = captor.getValue();

Ответ 3

Проще говоря, Представьте себе, хотите ли вы подшучивать над строкой:

StaticClass.method();

то вы пишете ниже строки кода, чтобы высмеять:

PowerMockito.mockStatic(StaticClass.class);
PowerMockito.doNothing().when(StaticClass.class);
StaticClass.method();

Ответ 4

Чтобы высмеять статический метод, возвращающий пустоту, например. Fileutils.forceMKdir(File file),

Пример кода:

File file =PowerMockito.mock(File.class);
PowerMockito.doNothing().when(FileUtils.class,"forceMkdir",file);