Вопрос-ответ

PowerMockito mock single static method and return object

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.

Переведено автоматически
Ответ 1

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

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

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

Из javadoc:


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


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

Вместо этого используйте версию mockStatic с 1 аргументом, чтобы включить заглушку статических методов, затем используйте 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());
}
}

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

Ответ 2

I created a unit test using String static method:

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

@RunWith(PowerMockRunner.class)
@PrepareForTest(String.class)
public class PowerMockTest {

@Test
public void staticMethodMocking() {
PowerMockito.mockStatic(String.class);
PowerMockito.when(String.valueOf(false)).thenReturn("true");
Assert.assertEquals("true", String.valueOf(false));
}

}
2024-02-29 05:56 java