Spring 4 e JUnit 4: come integrarli
Questo è un semplice esempio (grazie Flavio) di come integrare il contesto di Spring all’interno delle classi di test, per potervi iniettare beans tramite il meccanismo dell’autowire.
E’ possibile con l’annotazione @RunWith di JUnit. In sostanza, se una classe è annotato con @RunWith nel momento dell’esecuzione del test, JUnit invocherà la classe specificata nell’annotazione, invece di quella sua interna.
Ovviamente Spring ha una sua implementazione di JUnit, ed è proprio quella da usare:
@RunWith(SpringJUnit4ClassRunner.class) |
Il risultato finale è una classe per eseguire i test che ha a disposizione il context di Spring:
import static org.junit.Assert.assertEquals; import nicola.esempi.UnServizio; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * Unit test for simple App. */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:spring.xml" }) public class AppTest { @Autowired UnServizio unServizio; @Test public void testApp() { assertEquals("CIAO", unServizio.faiQualcosa()); } } |
Versioni e dipendenze
- Spring alla 4.1.0.RELEASE
- JUnit alla 4.11
Queste le dipendenze maven:
<properties> <spring.version>4.1.0.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <scope>test</scope> </dependency> </dependencies> |
Il progetto
Tutti i file che compongono questo fantastico progetto:

Il codice da testare
Un semplice servizio che non fa nulla definito da una interfaccia e da una una sua implementazione:
public interface UnServizio { public String faiQualcosa(); } public class UnServizioImpl implements UnServizio { private String param1; public String getParam1() { return param1; } public void setParam1(String param1) { this.param1 = param1; } public UnServizioImpl() {} public UnServizioImpl(String param1) { super(); this.param1 = param1; } @Override public String faiQualcosa() { return param1; } } |
Definizione del contesto di Spring
Dichiaro semplicemente un bean per istanziare l’implementazione del mio servizio:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config /> <context:component-scan base-package="nicola.esempi" /> <bean id="unServizio" class="nicola.esempi.UnServizioImpl"> <property name="param1" value="CIAO" /> </bean> </beans> |
Leave a Reply