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:

Esempio di integrazione fra Spring e junit
Esempio di integrazione fra Spring e junit

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>

Risultato

Ecco il risultato un volta lanciato il test
spring-junit2

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>