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.
import ResourcePublishServer server;
public class ExampleTest extends TestCase {
private CrlJob crlJob = new CrlJob();
@Override
protected void onSetUp() throws Exception {
server = new ResourcePublishServer(applicationContext);
server.start();
super.onSetUp();
}
@Override
protected void onTearDown() throws Exception {
server.stop();
super.onTearDown();
}
public void testDownloadCrl() throws Exception {
String crlAsResourceUrl = server.calculateUrl("/crl/kcanbusr3.crl");
// Vytvorime si certifikacni autoritu s CRL adresou ukazujici na testovaci HTTP server
IAuthorityBo auth = authorityTestData.createWithCrlUrl(crlAsResourceUrl);
crlJob.executeInternal();
assertEquals(1, crlDao.find(auth).size());
}
}
Komentáře