/ / Używanie Spock do wyśmiewania prywatnych statycznych zmiennych końcowych w Javie - Java, testowanie jednostkowe, groovy, spock

Używanie Spocka do wyśmiewania prywatnych statycznych zmiennych końcowych w Javie - java, testowanie jednostkowe, groovy, spock

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 № 1

Na 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.