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));
модульный тест выдает исключение:
org.mockito.исключения.неправильное использование.UnfinishedStubbingException: Незаконченный stubbing обнаруженный здесь: -> в орг.powermock.прикладной программный интерфейс.mockito.внутренний.PowerMockitoCore.doAnswer (PowerMockitoCore.java: 36)
Powermockito также предлагает мне использовать thenReturn или thenThrow после when, но кажется, что метод "when" возвращает void, когда он вызывается после doNothing (что логично). Если я попытаюсь:
PowerMockito.when(Resource.class, "readResources", Matchers.any(ResourcesElement.class)).....
doNothing нет вариант после когда.
мне удалось сделать методы без аргументов, чтобы ничего не делать, используя 2 аргумента версии метода. Например:
PowerMockito.doNothing().when(Moduler.class, "startProcessing");
это работает (startProcessing не принимает никаких аргументов).
но как я могу сделать методы, которые принимают аргументы, чтобы ничего не делать с Powermockito?
4 ответов
вы можете найти полностью функциональный пример ниже. Поскольку вы не опубликовали полный пример, я могу только предположить, что вы не аннотировали тестовый класс с помощью @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!");
}
}
если doNothing()
не работает, вы можете взломать его немного с помощью PowerMockito.doAnswer()
. Это позволяет вам издеваться над методами void, которые должны что-то делать, например, устанавливать значения и т. д. Если 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);
зачем проходить через столько проблем, чтобы ваш метод ничего не делал. Звоню PowerMockito.mockStatic(Resource.class)
должен заменить все статические методы в вашем классе заглушками по умолчанию, которые в основном означают, что они ничего не делают.
Если вы не хотите изменить поведение вашего метода, чтобы на самом деле сделать что-то просто вызывая PowerMockito.mockStatic(Resource.class)
должно хватить. Конечно, это также означает, что все статические методы в классе заглушены, которые вам нужно рассмотреть.
возможно, я не могу отменить ваш вопрос, но я считаю, что необходимо указать, что нужно сделать метод, поэтому, если вы не укажете 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!"));
Если вы не указали возврат, мой тест будет неудачным. Надеюсь, это поможет.