To, co chcesz zrobić, to połączenie części 1 i wszystkich 2.
Musisz użyć PowerMockito.mockStatic, aby włączyć statyczne mockowanie dla wszystkich statycznych metod klasy. Oznacza to, że można je odgiąć przy użyciu składni when-thenReturn.
Ale 2-argumentowe przeciążenie mockStatic, którego używasz, dostarcza domyślnej strategii dla tego, co Mockito / PowerMock powinien zrobić, gdy wywołujesz metodę, której nie masz jawnie ukrytego w instancji pozorowanej.
Z javadoc :
Tworzy makietę klasy z określoną strategią odpowiedzi na interakcje. Jest to dość zaawansowana funkcja i zazwyczaj nie jest potrzebna do pisania porządnych testów. Jednak może być pomocny podczas pracy ze starszymi systemami. Jest to domyślna odpowiedź, więc będzie używana tylko wtedy, gdy nie zdeponujesz wywołania metody.
Domyślny domyślna strategia Stubbing jest tylko wartość null powrotnej 0 lub false dla obiektu, liczby oraz logiczne cenionych metod. Używając przeciążenia 2-argowego, mówisz "Nie, nie, nie, domyślnie użyj tej metody odpowiedzi podklasy Answer, aby uzyskać wartość domyślną. Zwraca ona wartość Long, więc jeśli masz metody statyczne, które zwracają coś niezgodnego z Długo, jest problem.
Zamiast tego użyj wersji mockStatic z jednym argumentem, aby włączyć kodowanie metod statycznych, a następnie użyj funkcji when-thenReturn, aby określić, co należy zrobić dla określonej metody. Na przykład:
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());
}
}
Metoda statyczna o wartościach typu String jest skrócona, aby zwrócić „Hello!”, Podczas gdy metoda statyczna o wartościach int używa domyślnego kodu pośredniczącego, zwracając 0.
@PrepareForTest
Adnotacja powinna być klasa, która wywołuje metodę statyczną, a nie klasy, gdzie jest metoda statyczna.@PrepareForTest(ClassWithStatics.class)
ma rację.