Test Java EE (CDI / intercepteur) avec Arquillian

Aperçu

Testons Java EE avec Arquillian, le framework de test Java EE. Ceci est pratique car CDI et intercepteur peuvent être exécutés localement sans serveur Java EE.

La source utilisée cette fois est téléchargée sur Github. https://github.com/tuto00/Arquillian

Public cible

Débutant du test Java EE

Préparation

Maven Modifiez pom.xml pour utiliser Maven. Ajoutez les dépendances de bibliothèque JavaEE, Junit, Arquillian.

pom.xml


	<dependencies>
		<dependency>
			<groupId>org.jboss.spec</groupId>
			<artifactId>jboss-javaee-7.0</artifactId>
			<version>1.0.3.Final</version>
			<type>pom</type>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.jboss.arquillian</groupId>
			<artifactId>arquillian-bom</artifactId>
			<version>1.4.0.Final</version>
			<scope>import</scope>
			<type>pom</type>
		</dependency>
		<dependency>
			<groupId>org.jboss.arquillian.junit</groupId>
			<artifactId>arquillian-junit-container</artifactId>
			<version>1.4.0.Final</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.jboss.arquillian.container</groupId>
			<artifactId>arquillian-weld-ee-embedded-1.1</artifactId>
			<version>1.0.0.CR9</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.jboss.weld</groupId>
			<artifactId>weld-core</artifactId>
			<version>2.3.5.Final</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-simple</artifactId>
			<version>1.6.4</version>
			<scope>test</scope>
		</dependency>
	</dependencies>

beans.xml Veuillez vous préparer car vous souhaitez utiliser l'intercepteur.

beans.xml


<?xml version="1.0" ?>
<beans
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
    version="1.1"
    bean-discovery-mode="all">

     <interceptors>
        <class>org.arquillian.interceptor.TraceInterceptor</class>
    </interceptors>

</beans>

la mise en oeuvre

Injectez la classe Hello dans la classe GreetService. En outre, Interceptor (SampleInterceptor) est appliqué à la classe GreetService et la sortie du journal est effectuée avant et après l'exécution de la méthode.

GreetService.java


@Named
@ApplicationScoped
@SampleInterceptor
public class GreetService {

	@Inject
	Hello hello;

    public String greet(){
    	return hello.hello();
    }
}

@ApplicationScoped est également ajouté à la classe Hello pour en faire un bean géré par CDI.

Hello.java


@ApplicationScoped
public class Hello {

	public String hello() {
		return "helloWorld";
	}
}

Ensuite, identifiez l'intercepteur et créez une annotation pour l'exécuter.

SampleInterceptor.java


@Inherited
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface SampleInterceptor {
}

Ensuite, préparez ce qui suit sous la forme de l'implémentation de SampleInterceptor créé ci-dessus. Le nom de la classe et le nom de la méthode sont affichés avant que la méthode ne soit exécutée.

TraceInterceptor.java


@Interceptor
@SampleInterceptor
public class TestInterceptor {
	@AroundInvoke
	public Object obj(InvocationContext ic) throws Exception {

		//Avant d'exécuter la méthode
		System.out.println("process start class :" + ic.getTarget().getClass().getSimpleName()
				+ " method:" + ic.getMethod().getName());

		//Exécution de la méthode
		Object result = ic.proceed();

		//Après avoir exécuté la méthode
		System.out.println("process end");

		return result;
	}
}

Code de test

Enfin j'utiliserai le sujet principal Arquillian. J'écrirai le code de test.

GreetServiceTest.java


@RunWith(Arquillian.class)
public class GreetServiceTest {

	@Inject
	GreetService greeter;

	@Deployment
	public static JavaArchive createDeployment() {
		JavaArchive jar = ShrinkWrap.create(JavaArchive.class)
				.addPackage("org.arquillian.example")
				.addPackage("org.arquillian.annotation")
				.addPackage("org.arquillian.interceptor")
				.addAsManifestResource(new File("src/main/webapp/WEB-INF/beans.xml"));
		System.out.println(jar.toString(true));
		return jar;
	}

	@Test
	public void should_create_greeting() {
		assertEquals("helloWorld", greeter.greet());
	}
}

Contrairement à un Junit normal, il y a deux points lors de l'utilisation d'Arquillian.

Le mouvement est le suivant.

L'annotation @RunWith indique à JUnit d'utiliser Arquillian comme contrôleur de test. Arquillian recherche une méthode statique publique avec l'annotation @Deployment pour recevoir l'archive de test (c'est-à-dire le microdéploiement). Ensuite, la magie opère et chaque méthode @Test est exécutée dans l'environnement du conteneur.

Le fait est que vous avez créé un fichier jar et l'avez exécuté dans un conteneur. Le conteneur est contrôlé par l'adaptateur de conteneur d'Arquillian. Cette fois, nous utilisons Weld comme conteneur et arquillian-weld-ee-embedded-1.1 comme adaptateur de conteneur.

Essai

Maintenant, exécutons le test. Tout comme un Junit normal, vous pouvez exécuter la classe de test dans Junit.

Assurez-vous que le résultat du test devient vert et que vous voyez la sortie suivante sur la console:

588b9820-a6f0-4ffe-b6bd-e8228bc24b98.jar:
/org/
/org/arquillian/
/org/arquillian/example/
/org/arquillian/example/Hello.class
/org/arquillian/example/GreetService.class
/org/arquillian/example/GreeterTest.class
/org/arquillian/annotation/
/org/arquillian/annotation/SampleInterceptor.class
/org/arquillian/interceptor/
/org/arquillian/interceptor/TraceInterceptor.class
/META-INF/
/META-INF/beans.xml
INFO: WELD-000900: 2.3.5 (Final) [Dim 6 23 18:06:32 JST 2019]
process start class :GreetService$Proxy$_$$_WeldSubclass method:greet
process end

Vous pouvez voir que le début du processus, la fin du processus et l'intercepteur sont appliqués.

en conclusion

Arquillian facilite le test du CDI et de l'intercpteur. Veuillez l'essayer.

L'inconvénient est le manque de documentation. .. ..

URL de référence

Arquillian Guides

Recommended Posts

Test Java EE (CDI / intercepteur) avec Arquillian
Créer un environnement de test E2E avec Selenium (Java)
Activer Java EE avec NetBeans 9
[Java EE] Implémenter le client avec WebSocket
[Java] Tester des méthodes privées avec JUnit
Application Java EE One-JAR avec WebSphere Liberty
Présentation du test Java automatisé avec JUnit 5 + Gradle
Jugement des nombres premiers Java
[Java] Comment tester s'il est nul dans JUnit
[CircleCI 2.0] [Java] [Maven] [JUnit] Agréger les résultats des tests JUnit avec CircleCI 2.0
Présentation des tests Java automatisés avec JUnit 5 + Apache Maven
Créez et testez des applications Java + Gradle avec Wercker
Exécutez Maven sur Java 8 lors de la compilation sur Java 6 et des tests sur Java 11
Créer un environnement de test E2E avec Docker x Cypress
Java EE sans serveur à partir de Quarkus et Cloud Run
Installez java avec Homebrew
Test d'intégration avec Gradle
Changer de siège avec Java
Installez Java avec Ansible
Téléchargement confortable avec JAVA
Échantillon de bibliothèque de tests unitaires Java
Changer java avec direnv
[Rails] Test avec RSpec
Testez Nokogiri avec Rspec.
Téléchargement Java avec Ansible
Tester automatiquement avec la jauge
Test de charge avec JMeter
Raclons avec Java! !!
Faites un test unitaire avec Junit.
Construire Java avec Wercker
Conversion Endian avec JAVA
J'ai essayé de moderniser une application Java EE avec OpenShift.
[Java] Je souhaite tester l'entrée standard et la sortie standard avec JUnit