Thursday, October 21, 2010

Proves unitàries amb JUnit 4 i Spring Framework 3

La darrera vegada que havia treballat amb JUnit i Spring les versions que feia servir era JUnit 3 i Spring 1.2, i era la versió 1.4 del Java. Com han canviat les coses!

Amb la introducció de les annotations al Java 5 s'han pogut simplificar molts aspectes de la codificació i s'ha adoptat immediatament a la majoria dels frameworks existents.

Ara, gracies a les annotations, JUnit 4 és molt més senzill. Ara no cal extendre d'una classe, ni que els mètodes de prova tinguin noms determinats. Ara, fer que un mètode sigui processable per JUnit és tan fàcil com afegir-li l'anotació @Test. Quan afegeixes aquesta anotació per primera vegada a un projecte d'Eclipse i li fas un Ctrl+1 (quick fix) et suggereix automàticament "Add JUnit 4 library to the build path". I un cop afegida la llibreria i definit el test ja pots executar com "JUnit Test" (o Alt+Shift+X, T). (Per cert, va gé aprendre els millors shortcuts d'Eclipse).


@Test
public void testFindDrugById() {
Drug drug = drugDAO.findDrugById(80000L);
assertEquals("Drug get is not equal", drug, paracetamol);
}



Recomano llegir la introducció de 60 segons a JUnit 4 i el llibre de receptes de JUnit.

Fer servir Spring amb JUnit era molt farragós, sobretot la part de llegir l'applicationContext.xml i la resta de fitxers de configuració, però a partir de Spring 2.5 és molt fàcil.

Si afegeixes a la classe les anotacions @RunWith(SpringJUnit4ClassRunner.class) i @ContextConfiguration, JUnit anirà a buscar un fitxer de configuració amb el mateix nom de la classe acabat en -context.xml, just en el mateix directori on es troba la classe de test.

Si vols tenir una miqueta més de control dels fitxers de configuració, pots afegir l'anotació indicant-li els fitxers que vols carregar:

@ContextConfiguration(locations = { "classpath:myapp-context.xml", "classpath:myapp-service.xml" })

Un cop tens configurat això pots definir qualsevol atribut amb el mateix nom que el bean del XML i amb l'annotation @Autowired i ja t'ho injecta automàticament. O si vols agafar els beans directament de l'applicationContext pots fer-lo servir també:


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class TestDrugDAO {

@Autowired
private ApplicationContext applicationContext;

@Test
public void beforeEveryTest() {
drugDAO = (DrugDAO) applicationContext.getBean("drugDAO");



Ara resulta molt més fàcil però sempre hi ha bones excuses per no fer proves unitàries, no?

No comments: