Jak jednoduše simulovat v testech HTTP server
O autorovi: Jetyho blog | LinkedIn
Pavel Jetenský se věnuje Java/J2EE vývoji již od roku 2003, z toho několik let v Irsku. Zajímají ho techniky automatického testování. V současné době pracuje jako metodický vedoucí Java/J2EE v Deltax Systems a.s.
Občas při tvorbě automatických testů potřebujeme otestovat funkcionalitu, která stahuje nějaká data z Internetu. V mém případě to byla funkce na stahování seznamu zneplatněných certifikátů (CRL). Původně jsem měl automatický test napsaný tak, že se seznam skutečně stahoval. To bylo nevýhodné ze dvou důvodů:
- test nefungoval bez připojení k internetu
- těžko šlo ovlivnit v rámci testu stahovaná data
Napsal jsem si tedy jednoduchou implementaci HTTP serveru, která publikuje soubory z classpath pod stejnou relativní cestou na localhost adrese. Např. soubor s CRL umístěný v src\test\resources\crl\emptyCrl.crl je po spuštění serveru ke stažení na:
http://localhost:8001/ResourcePublishServer/crl/emptyCrl.crl
Moje řešení obsahuje dvě třídy: ResourcePublishServer.java a ResourceToResponseHandler.java a využívá HTTP server, který se nově objevil v JDK 1.6 (viz. JavaDoc k HttpServer.create).
Třídy ke stažení (ZIP)
Pozn.: Třídy jsou nyní závislé na Spring aplikačním kontextu, ale drobnou úpravou (nahrazením volání applicationContext.getResources za getClass().getResourceAsStream) by je šlo použít i tam, kde Spring není.
Ukázka použití serveru v testu
Pozn.: Stažené CRL, které se použije v testu, je uložené v CVS (tj. není přiloženo k ukázkovým třídám) ve složce src\test\resources\crl\kcanbusr3.crl.
Související články:
- Mock FTP server – další perla do sbírky automatického testování
- Sdílení session mezi protokoly HTTP a HTTPS
- Jak nainstalovat MySQL server na Windows Vista
- Zajímavý článek o Artifactory na The Server Side
- Testing Aspect Pointcuts – is there an easy way?




Možná hloupý dotaz – proč bylo potřeba psát vlastní HTTP server a nepoužít pro testování např. Jetty?
Odpovím za Jetyho – žádný HTTP Server se v daném řešení nepíše. Jen se využívá existující třídy HttpServer, která je v JDK 6. Přiložené třídy jsou jen supportní obal pro jednoduché použití v automatických testech.
Toto řešení je v podstatě ekvivalentní použití např. Jetty kontejneru – jen je daleko lehčí a zároveň není nutné k projektu linkovat další dependency.