Powermockito doNothing для метода с аргументами
Я разработал приложение на Java, и я пытаюсь создать модульные тесты с использованием Powermockito (я должен добавить, что я новичок в модульном тестировании).
У меня есть класс Resource, который имеет статический метод readResources:
public static void readResources(ResourcesElement resourcesElement);
ResourcesElement также кодируется мной.
При тестировании я хочу создать свой собственный ресурс, поэтому я хочу, чтобы вышеупомянутый метод ничего не делал.
Я пробовал использовать этот код:
PowerMockito.spy(Resource.class);
PowerMockito.doNothing().when(Resource.class, "readResources", Matchers.any(ResourcesElement.class));
unit test выдает исключение:
org.mockito.exceptions.misusing.UnfinishedStubbingException: Обнаружено следующее: → at org.powermock.api.mockito.internal.PowerMockitoCore.doAnswer(PowerMockitoCore.java:36)
Powermockito также предполагает, что я должен использовать thenReturn или thenThrow после того, когда, но кажется, что метод "когда" возвращает void, когда он вызывается после doNothing (что логично).
Если я попробую:
PowerMockito.when(Resource.class, "readResources", Matchers.any(ResourcesElement.class)).....
doNothing не является опцией после того, когда.
Мне удалось сделать методы без аргументов, чтобы ничего не делать, используя версию аргумента 2 аргумента. Например:
PowerMockito.doNothing().when(Moduler.class, "startProcessing");
Это работает (startProcessing не принимает никаких аргументов).
Но как я могу создавать методы, которые принимают аргументы, чтобы ничего не делать с Powermockito?
Ответы
Ответ 1
Ниже приведен полный функциональный пример. Поскольку вы не опубликовали полный пример, я могу только предположить, что вы не аннотировали тестовый класс с помощью @RunWith
или @PrepareForTest
, потому что остальное кажется прекрасным.
@RunWith(PowerMockRunner.class)
@PrepareForTest({Resource.class})
public class MockingTest{
@Test
public void shouldMockVoidStaticMethod() throws Exception {
PowerMockito.spy(Resource.class);
PowerMockito.doNothing().when(Resource.class, "readResources", Mockito.any(String.class));
//no exception heeeeere!
Resource.readResources("whatever");
PowerMockito.verifyStatic();
Resource.readResources("whatever");
}
}
class Resource {
public static void readResources(String someArgument) {
throw new UnsupportedOperationException("meh!");
}
}
Ответ 2
Если doNothing()
не работает, вы можете немного взломать его, используя PowerMockito.doAnswer()
. Это позволяет вам высмеивать недействительные методы, которые должны что-то делать, например, устанавливать значения и т.д. Если doNothing()
не работает, использование пустой doAnswer()
должно работать нормально.
Пример:
PowerMockito.doAnswer(new org.mockito.stubbing.Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
return null; //does nothing
}
}).when(mockObject).methodYouWantToDoNothing(args);
Ответ 3
Зачем так много беспокоиться, чтобы ваш метод ничего не делал. Просто вызов PowerMockito.mockStatic(Resource.class)
должен заменить все статические методы в вашем классе на заглушки по умолчанию, которые в основном означают, что они ничего не делают.
Если вы не хотите изменить поведение своего метода, чтобы на самом деле сделать что-то, достаточно просто вызвать PowerMockito.mockStatic(Resource.class)
. Конечно же, это означает, что все статические методы в классе заштрихованы, что вам нужно рассмотреть.
Ответ 4
Возможно, я не могу раскрыть ваш вопрос, но я считаю, что необходимо указать, что нужно делать
метод, поэтому, если вы не укажете thenReturn или thenThrow или что-то, что powerMockito не знает, что делать, когда читаете ваш реальный код, например:
РЕАЛЬНЫЙ КОД:
IPager pag;
IPagerData<List<IDeute>> dpag;
pag = new PagerImpl();
pag.setFiles(nombrefilesPaginador);
pag.setInici(1);
dpag = gptService.obtenirDeutes(idSubjecte, idEns, tipusDeute, periode, pag);
Проверка реального кода с помощью mockito:
IPager pag = new PagerImpl();
pag.setInici(1);
pag.setFiles(0);
when(serveiGpt.obtenirDeutes(eq(331225L),
eq(IConstantsIdentificadors.ID_ENS_BASE),
Matchers.any(ETipusDeute.class),
Matchers.any(EPeriodeDeute.class),
eq(pag)))
.thenThrow(new NullPointerException(" Null!"));
Если не указать return, мой тест будет терпеть неудачу.
Надеюсь, это поможет.