Używam Springa 3.1.4.RELEASE i Mockito 1.9.5. Na moich zajęciach wiosennych mam:
@Value("#{myProps['default.url']}")
private String defaultUrl;
@Value("#{myProps['default.password']}")
private String defaultrPassword;
// ...
Z mojego testu JUnit, który obecnie skonfigurowałem w następujący sposób:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:test-context.xml" })
public class MyTest
{
Chciałbym sfałszować wartość mojego pola „defaultUrl”. Zauważ, że nie chcę naśladować wartości dla innych pól - chciałbym zachować je takimi, jakimi są, tylko pole „defaultUrl”. Zauważ również, że nie mam jawnych metod "ustawiających" (np. setDefaultUrl
) W mojej klasie i nie chcę tworzyć żadnych tylko do celów testowych.
Biorąc to pod uwagę, jak mogę zakpić wartość dla tego jednego pola?
ReflectionTestUtils.setField(bean, "fieldName", "value");
przed wywołaniembean
metody podczas testu.To był trzeci raz, kiedy googlowałem do tego wpisu SO, ponieważ zawsze zapominam, jak kpić z pola @Value. Chociaż zaakceptowana odpowiedź jest poprawna, zawsze potrzebuję trochę czasu, aby uzyskać prawidłowe wywołanie „setField”, więc przynajmniej dla siebie wklejam tutaj przykładowy fragment:
Klasa produkcyjna:
Klasa testu:
źródło
Możesz również mockować konfigurację właściwości w klasie testowej
źródło
Chciałbym zasugerować pokrewne rozwiązanie,
@Value
polegające na przekazaniu pól z adnotacjami jako parametrów do konstruktora zamiast używaniaReflectionTestUtils
klasy.Zamiast tego:
i
Zrób to:
i
Korzyści z tego podejścia: 1) możemy utworzyć instancję klasy Foo bez kontenera zależności (to tylko konstruktor), oraz 2) nie łączymy naszego testu z naszymi szczegółami implementacji (odbicie wiąże nas z nazwą pola za pomocą łańcucha, co może spowodować problem, jeśli zmienimy nazwę pola).
źródło
Możesz użyć tej magicznej adnotacji Spring Test:
zobacz org.springframework.test.context.TestPropertySource
Na przykład jest to klasa testowa:
A to jest klasa z właściwością:
źródło
Użyłem poniższego kodu i zadziałało:
Źródła: https://www.jeejava.com/mock-an-autowired-value-field-in-spring-with-junit-mockito/
źródło
Jednym ze sposobów rozwiązania tego problemu jest zmiana klasy tak, aby używała funkcji Constructor Injection , która jest używana do testowania i wtrysku sprężyny. Nigdy więcej refleksji :)
Możesz więc przekazać dowolny ciąg przy użyciu konstruktora:
W swoim teście po prostu go użyj:
źródło