Подтвердить что ты не робот

PowerMockito макет одиночного статического метода и возвращаемого объекта

Я хочу издеваться над статическим методом m1 из класса, который содержит 2 статических метода, m1 и m2. И я хочу, чтобы метод m1 возвращал объект.

Я попробовал следующее

1)

PowerMockito.mockStatic(Static.class, new Answer<Long>() {
         @Override
         public Long answer(InvocationOnMock invocation) throws Throwable {
            return 1000l;
         }
      });

Это вызывает как m1, так и m2, которые имеют другой тип возврата, поэтому он дает ошибку несоответствия типа возврата.

2) PowerMockito.when(Static.m1(param1, param2)).thenReturn(1000l);  Но это не вызывается, когда выполняется m1.

3) PowerMockito.mockPartial(Static.class, "m1"); Дает ошибку компилятора, что mockPartial недоступен, который я получил от http://code.google.com/p/powermock/wiki/MockitoUsage.

4b9b3361

Ответ 1

Что вы хотите сделать, это комбинация части 1 и всего 2.

Вам нужно использовать PowerMockito.mockStatic для включения статического смеха для всех статических методов класса. Это означает, что возможно, чтобы заглушить их, используя синтаксис when-thenReturn.

Но 2-аргументная перегрузка mockStatic, которую вы используете, использует стратегию по умолчанию для того, что Mockito/PowerMock должен делать, когда вы вызываете метод, который вы явно не наложили на экземпляр mock.

Из javadoc:

Создает макет класса с указанной стратегией для ответов на взаимодействия. Это довольно продвинутая функция и, как правило, вам не нужна это написать достойные тесты. Однако это может быть полезно при работе с устаревшие системы. Это ответ по умолчанию, поэтому он будет использоваться только тогда, когда вы не закрываете вызов метода.

Стратегия stubbing по умолчанию по умолчанию - это просто вернуть null, 0 или false для объектов, числа и логических значений. Используя перегрузку 2-arg, вы говорите: "Нет, нет, нет, по умолчанию используйте метод ответа" Подкласс "ответа, чтобы получить значение по умолчанию. Он возвращает Long, поэтому, если у вас есть статические методы, возвращающие что-то несовместимое с Долго, есть проблема.

Вместо этого используйте версию mockStatic 1-arg для включения stubbing статических методов, а затем используйте when-thenReturn, чтобы указать, что делать для определенного метода. Например:

import static org.mockito.Mockito.*;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

class ClassWithStatics {
  public static String getString() {
    return "String";
  }

  public static int getInt() {
    return 1;
  }
}

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithStatics.class)
public class StubJustOneStatic {
  @Test
  public void test() {
    PowerMockito.mockStatic(ClassWithStatics.class);

    when(ClassWithStatics.getString()).thenReturn("Hello!");

    System.out.println("String: " + ClassWithStatics.getString());
    System.out.println("Int: " + ClassWithStatics.getInt());
  }
}

String -значный статический метод заглушается, чтобы возвращать "Hello!", в то время как встроенный статический метод использует стандартную процедуру stubbing, возвращая 0.