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!"));

Если вы не указали возврат, мой тест будет неудачным. Надеюсь, это поможет.