EJB 3 Yksikkötestauksesta 1/3

Test Driven Development ja Enterprise JavaBean ei ole ollut aihe jota usein liitetään yhteen, mutta EJB 3 malli muutti tilannetta aikalailla. Vietin hiljattain hetken aikaa tutkin asiaa ja totesin että on monta tapaa tehdä tätä niittäen perinteiset TDD lähestymistavan hyödyt.

Koska EJB on palvelimessa ajettavaa koodia, yksinkertaisin tapa tehdä sille testi on tehdä sille client sovellus, joka kutsuu ejb rajapinnan palveluita ja tutkii palautettuja arvoja ja heitettyjä poikkeuksia. Tässä esimerkki JUnit testimetodista:

// example code: using unit testing to test remote interface over iiop

public void testAdd() {
try {
// requires remote interfaces
Context initial = new InitialContext();
CalculatorBeanRemote cb = (CalculatorBeanRemote) initial.lookup(CalculatorBeanRemote.class.getName());
System.out.println(”add”);
double p1 = 1;
double p2 = 2;
double expResult = 3;
double result = cb.add(p1, p2);
assertEquals(expResult, result, 0.0);
} catch (NamingException ex) {
Logger.getLogger(CalculatorBeanTest1_JNDIClient.class.getName()).log(Level.SEVERE, null, ex);
fail(ex.getMessage());
}
}

Tämä ei kuitenkaan ole kovin puhdasta testausta koska

  • Testin ajaminen ei ole kovin nopeaa, palvelimen tulee olla käynnissä ja rmi-iiop kutsuihin menee aikaa. Suuren testimäärän ajaminen ei tapahdu sekunneissa.
  • Testit ovat hyvin riippuvaisia palvelimesta ja sen säännöistä, näin testiympäristön pystyttäminen ja samankaltaisuuden varmistaminen ei olekaan ihan triviaali juttu
  • Pystytettävänä ei ole vain testisovelluspalvelin, vaan siihen liittyen testi-jndi, testi-sanomapalvelin ja testitietokannat
  • Jos testi vaikuttaa persistenttiin dataan, esim. tietokantadataan, tulisi taata vakioitu lähtötilanne ja varmistaa ettei testi myöskään vaikuta esim. tuotantoympäristöön eli niiden tulisi olla erilliset.
  • Tällainen testaus vaatii remote tyyppiset rajapinnat kaikille testattaville objekteille

EJB:n testaaminen aitoa vastaavassa säiliössä on siitä hyvä malli että se selvittää kerralla kokonaisuuden toimivuuden. Kuitenkin agile tdd tyyppinen testaus on enemmän suunnitteluväline ja tähtää nopeasti ajettaviin, riippumattomiin testeihin, sekä keskittyy ennen muuta business-logiikan testaukseen. Näin ollen ylläoleva tapa ei ole TDD näkökulmasta kovin luonteva.

Perus POJO yksikkötestaus

EJB 3 tarjoaa kuitenkin uusia mahdollisuuksia. Koska EJB itsessään on POJO (Plain Old Java Object), sen voi instansioida ilman säiliötä ja yksikkötestata vaikka JUnit työkalulla suoraan. Tässä esim:

CalculatorBean.java:

package calculator;

import javax.ejb.Stateless;

@Stateless
public class CalculatorBean implements CalculatorBeanLocal {

public double add(double p1, double p2) {
return p1+p2;
}

}

CalculatorBeanTest.java:

package calculator;

import junit.framework.TestCase;

public class CalculatorBeanTest extends TestCase {

public CalculatorBeanTest(String testName) {
super(testName);
}

@Override
protected void setUp() throws Exception {
super.setUp();
}

@Override
protected void tearDown() throws Exception {
super.tearDown();
}

public void testAdd() {
System.out.println(”add”);
double p1 = 1;
double p2 = 2;
CalculatorBean instance = new CalculatorBean();
double expResult = 3;
double result = instance.add(p1, p2);
assertEquals(expResult, result, 0.0);
}

}

Kaikki hyvin? Eli Test Driven Development sopii loistavasti EJB business logiikan testaamiseen ja suunnittelemiseen. Vaan entä kun on sitten kyse ei-triviaalista tapauksesta? EJB yllä sisälsi vain riippumatonta logiikkaa, mutta aidon elämän EJB sisältää mm. tietokannan käyttöä ja integraatiota eri protokollilla, riippuvuuksia erilaisiin palveluihin ja rajapintoihin löytyy.

EJB 3.0 Test Successful

Pohdiskellaan aidosti monimutkaista logiikkaa ja resursseja sisältävän EJB:n testaustapoja lisää ensi jaksossa.

Mainokset

One thought on “EJB 3 Yksikkötestauksesta 1/3

  1. Päivitysilmoitus: Unit testing EJB 3 | Lean Developer

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