PowerMockito VerifyStatic не работает в 2.0.0-бета5 - программирование

PowerMockito VerifyStatic не работает в 2.0.0-бета5

У меня возникает проблема с использованием powermockito (2.0.0-beta5) для проверки того, что статический метод вызывался определенное количество раз, когда я вызываю другой (также статический) метод. Классы подготовлены для тестирования в верхней части моего тестового файла. Соответствующий фрагмент кода:

mockStatic(Tester.class);
when(Tester.staticMethod(anyString(), anyString())).thenAnswer(new FirstResponseWithText());
OtherClass.methodThatCallsTesterStaticMethod("", "", "", false, "");
verifyStatic(Tester.class, times(3));
Tester.sendFaqRequest(anyString(), anyString());

FirstResponseWithText - это класс, который расширяет тип Answer управляет порядком ответов. Я использовал это в другом месте, и он отлично работает.

Я получаю следующую ошибку в строке verifyStatic:

org.mockito.exceptions.misusing.NotAMockException: 
Argument passed to verify() is of type Class and is not a mock!
Make sure you place the parenthesis correctly!
See the examples of correct verifications:
    verify(mock).someMethod();
    verify(mock, times(10)).someMethod();
    verify(mock, atLeastOnce()).someMethod();

Как правильно передать класс в verifyStatic? Все примеры, которые я могу найти в Интернете, предназначены для выпусков до 2.xx, где verifyStatic не принимает параметр класса.

4b9b3361

Ответ 1

Я думаю, что версия PowerMockito не проблема. Я тестировал следующий код с версиями

  • 1.7.3,
  • 2.0.0-бета .5 (ваша версия),
  • 2.0.2.

Классы приложений:

package de.scrum_master.stackoverflow.q52952222;

public class Tester {
  public static String sendFaqRequest(String one, String two) {
    return "real response";
  }
}
package de.scrum_master.stackoverflow.q52952222;

public class OtherClass {
  public static void methodThatCallsTesterStaticMethod(String one, String two, String three, boolean four, String five) {
    System.out.println(Tester.sendFaqRequest("A", "B"));
    System.out.println(Tester.sendFaqRequest("C", "D"));
    System.out.println(Tester.sendFaqRequest("E", "F"));
  }
}

Тестовые занятия:

package de.scrum_master.stackoverflow.q52952222;

import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;

import java.util.Arrays;

public class FirstResponseWithText implements Answer {
  @Override
  public Object answer(InvocationOnMock invocation) throws Throwable {
    Object[] args = invocation.getArguments();
    String methodName = invocation.getMethod().getName();
    return methodName + " called with arguments: " + Arrays.toString(args);
  }
}
package de.scrum_master.stackoverflow.q52952222;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.times;
import static org.powermock.api.mockito.PowerMockito.*;

@RunWith(PowerMockRunner.class)
@PrepareForTest({ Tester.class })
public class MyTest {
  @Test
  public void myTest() {
    // Tell PowerMockito that we want to mock static methods in this class
    mockStatic(Tester.class);
    // Stub return value for static method call
    when(Tester.sendFaqRequest(anyString(), anyString())).thenAnswer(new FirstResponseWithText());
    // Call method which calls our static method 3x
    OtherClass.methodThatCallsTesterStaticMethod("", "", "", false, "");
    // Verify that Tester.sendFaqRequest was called 3x
    verifyStatic(Tester.class, times(3));
    Tester.sendFaqRequest(anyString(), anyString());
  }
}

Так что, если это не работает для вас, и с вашими зависимостями Maven или Gradle тоже все в порядке, возможно, разница в вашем классе FirstResponseWithText. Может быть, вы хотите показать это, чтобы мы все могли видеть, какую магию вы там делаете. Как вы можете видеть из моего примера кода, мне пришлось сделать несколько обоснованных предположений, потому что вы делитесь лишь небольшим фрагментом тестового кода, а не MCVE, как вы должны. Таким образом, я могу только строить догадки, и на самом деле мне это не нравится, потому что это может быть пустой тратой времени и для вас, и для меня.