Jak jednoduše simulovat v testech HTTP server

Pavel Jetensky

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());
   }
}