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, мой тест будет терпеть неудачу. Надеюсь, это поможет.