Mockito mockingDetails.getInvocations() вопрос

Что я пытаюсь сделать, так это распечатать количество раз, когда определенный метод вызывался с помощью Mockito.

Когда я делаю следующее:

 int counter =
    Mockito.mockingDetails(myDependency)
        .getInvocations()
        .size();
System.out.println( counter );

он выводит все методы, вызванные на макете, однако я хочу распечатать счетчик только для одного конкретного метода, поэтому, если я попытаюсь,

 int counter =
    Mockito.mockingDetails(myDependency.doSomething())
        .getInvocations()
        .size();
System.out.println( counter );

возникает ошибка, говорящая о том, что

Аргумент, переданный в Mockito.mockingDetails(), должен быть макетом, но равен нулю!

кто-нибудь знает, как решить эту проблему? Заранее спасибо!


person pleasehelpmeee    schedule 01.04.2020    source источник
comment
Почему вы пытаетесь получить эту информацию и что вы хотите с ней делать? Если вы хотите проверить, что метод был вызван определенное количество раз, вы должны использовать что-то вроде this. Если это не удается, вы также увидите, сколько раз метод действительно вызывался.   -  person second    schedule 02.04.2020
comment
Аргумент, переданный в Mockito.mockingDetails(), должен быть макетом, но равен нулю! ..звучит понятно (и правдоподобно ..насколько я знаю mockito)   -  person xerx593    schedule 05.04.2020
comment
.. это должно быть Mockito.mockingDetails(myDependency)... ...что даст вам информацию, относящуюся ко всему макету (объекту), если вам нужна информация о doSomething(), вы можете создать/итерировать getStubbings()   -  person xerx593    schedule 05.04.2020


Ответы (1)


Вы можете играть с отражением:

MockingDetails mockingDetails = Mockito.mockingDetails(myDependency);

Method doSomethingMethod = mockingDetails.getMockHandler()
    .getMockSettings()
    .getTypeToMock()
    .getMethod("doSomething"); //here you can also pass the arguments of this method

long counter = mockingDetails.getInvocations()
    .stream()
    .filter(invocation -> invocation.getMethod().equals(doSomethingMethod))
    .count();

Обратите внимание: чтобы получить объект класса Method, мы не можем просто вызвать myDependency.getClass().getMethod("doSomething"), потому что в этом случае getClass() вернет класс-оболочку Mockito, сгенерированный во время выполнения, с собственными объектами Method. Таким образом, equals в фильтре вернет false позже.

person amseager    schedule 04.04.2020