Próbuję napisać kilka testów Spock z Groovy, aby przetestować kod Java (w szczególności filtr serwletu). Mam trochę private static
i private static final
zmienne, które chciałbym kpić, ale nie mogę ustalić, czy jest na to sposób. Wiem metaClass
jest dostępny dla metod, czy jest coś podobnego dla zmiennych?
Na przykład:
public class MyFilter implements Filter {
private static WebResource RESOURCE;
private static final String CACHE_KEY = "key-to-be-used-for-cache";
... actual methods, etc ...
}
Próbowałem używać Mock(MyFilter)
, a także za pomocą odbicie Java w celu zmiany wartości (na podstawie tego pytania i odpowiedzi Zmień prywatne statyczne pole końcowe za pomocą odbicie Java).
Chciałbym to zrobić bez dodawania czegoś takiego jak Mockito lub inne frameworki, jeśli to możliwe, wystarczy użyć zwykłego Groovy i Spock.
Dzięki za wszelkie pomysły!
AKTUALIZACJA 1
Przynajmniej dla private static
zmienne, które dostałem do pracy:
Field field = MyFilter.class.getDeclaredField("CACHE_KEY")
field.setAccessible(true)
field.set(null, "new-key-value")
Ale wciąż nie byłem w stanie ominąć final
aspekt.
AKTUALIZACJA 2
Dzięki Xv. Teraz mogę to ustawić za pomocą:
Field field = MyFilter.class.getDeclaredField("CACHE_KEY")
field.setAccessible(true)
Field modifiersField = Field.class.getDeclaredField("modifiers")
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, "new-key-value")
Odpowiedzi:
7 dla odpowiedzi № 1Na podstawie tego, czego się nauczyłem https://stackoverflow.com/a/25031713/239408, to działa dla mnie w spocku
import java.lang.reflect.Field
import java.lang.reflect.Modifier
...
def setup() {
Field field = BackendCredentials.getDeclaredField("logger")
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, Mock(Logger))
}
Wygląda na to, że brakuje Ci rozbrojenia Modifier.FINAL
flaga.
1 dla odpowiedzi nr 2
Musisz użyć PowerMock (lub innegopodobne rozwiązanie) lub refaktoryzuj kod. Spock nie obsługuje samodzielnego kpowania z metod prywatnych / statycznych / końcowych. To ograniczenie jest również obecne w Mockito, więc musi dać ci wskazówkę dotyczącą najlepszych praktyk.