EJB 3 Yksikkötestauksesta 4/3

Jep, otsikko ei ole virhe. Kirjailin aikanaan inspiroituneena artikkelisarjan siitä miten EJB 3.0 komponentteja voi yksikkötestata eri tavoin esim. test driven development hengessä tai vain 100% testikattavuuden merkeissä. Nyt tuli ajankohtaiseksi tehdä uusi täydennys koska kurssia pitäessä tuli puheeksi Java EE 6 Embedded Container malli, joten teen siitä tähän pienen muistion.

Yksi pienemmistä EE 6 päivityksistä oli Embedded Container, eli ohjelmakoodista käynnistettävä EJB säiliö joka sopii loistavasti esim. EJB komponenttien yksikkötestaukseen. Tässä esimerkki yksinkertaisen laskimen testauskoodista:

@Test
  public void hello() throws NamingException {
    EJBContainer ejbC = EJBContainer.createEJBContainer();
    Context ctx = ejbC.getContext();

    CalculatorBeanRemote helloWorld = 
      (CalculatorBeanRemote) ctx.lookup("java:global/classes/CalculatorBean");

    assertNotNull(helloWorld);
    double expected=11;
    double result = helloWorld.add(5, 6);
    assertEquals(expected, result, 0.0);
    ejbC.close();
}

Komento oli siis EJBContainer.createEJBContainer(). Tämä käynnistää kevyen sisäänrakennetun glassfish serverin, jolta voi pyytää Context tyyppisen viittauksen nimipalveluun, ja sieltä taas voi pyydää luokkia jotka ovat ejb annotaatiolla varustettuja ja löytyvät luokkapolusta – niitä ei siis tarvitse erikseen asentaa.

Huomioitavaa.. Container antaa mahdollisuuden testata beaniä säiliön elinkaaripalveluiden kera, joka antaa realistisemman kuvan. Toisaalta säiliön käynnistäminen vie hetken, vaatii porttiosoitteita, ja ei testaa luokkaa aidosti eristyksissä vaan on tosiasiassa enemmänkin integraatiotestausta. Mutta tällekin on varmasti käyttönsä ja valinnanvara ei ole yleensä huono juttu.

Tässä vielä vähän vertailua POJO tyyppisen yksikkötestin suoritusajasta vs Embedded Container yksikkötesti, molemmat netbeansissä junitilla.

Toki rehellisyyden nimissä myönnettävä että container käynnistyminen on kertaluonteinen operaatio eli se ei siitä enää paljoa hidastu kun lataat useampia EJB luokkia, näin siis 100 EJB testiä ei ole 100x7sekuntia vaan 100×0.07s + 7s 😉

Advertisements

Vastaa

Täytä tietosi alle tai klikkaa kuvaketta kirjautuaksesi sisään:

WordPress.com-logo

Olet kommentoimassa WordPress.com -tilin nimissä. Log Out / Muuta )

Twitter-kuva

Olet kommentoimassa Twitter -tilin nimissä. Log Out / Muuta )

Facebook-kuva

Olet kommentoimassa Facebook -tilin nimissä. Log Out / Muuta )

Google+ photo

Olet kommentoimassa Google+ -tilin nimissä. Log Out / Muuta )

Muodostetaan yhteyttä palveluun %s