Как мне высмеять статический метод, который возвращает 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
для успеха, но мне не нравятся обходные пути.
Ответы
Ответ 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);