Java EE Test (CDI / Interceptor) mit Arquillian

Überblick

Testen wir Java EE mit Arquillian, dem Java EE-Testframework. Dies ist praktisch, da CDI und Interceptor lokal ohne einen Java EE-Server ausgeführt werden können.

Die diesmal verwendete Quelle wird auf Github hochgeladen. https://github.com/tuto00/Arquillian

Zielgruppe

Java EE Test Anfänger

Vorbereitung

Maven Bearbeiten Sie pom.xml, um Maven zu verwenden. Fügen Sie Abhängigkeiten der JavaEE-, Junit- und Arquillian-Bibliothek hinzu.

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 Bitte bereiten Sie sich vor, da Sie den Interceptor verwenden möchten.

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>

Implementierung

Fügen Sie die Hello-Klasse in die GreetService-Klasse ein. Wenden Sie außerdem Interceptor (SampleInterceptor) auf die GreetService-Klasse an und geben Sie das Protokoll vor und nach der Ausführung der Methode aus.

GreetService.java


@Named
@ApplicationScoped
@SampleInterceptor
public class GreetService {

	@Inject
	Hello hello;

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

@ApplicationScoped wird ebenfalls zur Hello-Klasse hinzugefügt, um sie zu einer CDI-verwalteten Bean zu machen.

Hello.java


@ApplicationScoped
public class Hello {

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

Identifizieren Sie als Nächstes den Interceptor und erstellen Sie eine Anmerkung, um ihn auszuführen.

SampleInterceptor.java


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

Bereiten Sie dann Folgendes in Form der Implementierung des oben erstellten SampleInterceptor vor. Der Klassenname und der Methodenname werden ausgegeben, bevor die Methode ausgeführt wird.

TraceInterceptor.java


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

		//Vor dem Ausführen der Methode
		System.out.println("process start class :" + ic.getTarget().getClass().getSimpleName()
				+ " method:" + ic.getMethod().getName());

		//Methodenausführung
		Object result = ic.proceed();

		//Nach dem Ausführen der Methode
		System.out.println("process end");

		return result;
	}
}

Testcode

Schließlich werde ich das Hauptthema Arquillian verwenden. Ich werde den Testcode schreiben.

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());
	}
}

Im Gegensatz zu einem normalen Junit gibt es bei der Verwendung von Arquillian zwei Punkte.

Die Bewegung ist wie folgt.

Die Annotation @RunWith weist JUnit an, Arquillian als Testcontroller zu verwenden. Arquillian sucht nach einer öffentlichen statischen Methode mit der Annotation @Deployment, um das Testarchiv zu erhalten (dh Mikrobereitstellung). Dann passiert Magie und jede @ Test-Methode wird in der Containerumgebung ausgeführt.

Der Punkt ist, dass Sie ein Glas erstellt und es in einem Container ausgeführt haben. Der Container wird vom Containeradapter von Arquillian gesteuert. Dieses Mal verwenden wir Weld als Container und Arquillian-Weld-Ee-Embedded-1.1 als Containeradapter.

Testlauf

Lassen Sie uns nun den Test ausführen. Wie bei einem normalen Junit können Sie die Testklasse in Junit ausführen.

Stellen Sie sicher, dass das Testergebnis grün wird und die folgende Ausgabe auf der Konsole angezeigt wird:

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) [So 6 23 18:06:32 JST 2019]
process start class :GreetService$Proxy$_$$_WeldSubclass method:greet
process end

Sie können sehen, dass Prozessstart, Prozessede und Interceptor angewendet werden.

abschließend

Arquillian macht es einfach, CDI und Intercptor zu testen. Bitte probieren Sie es aus.

Der Nachteil ist der Mangel an Dokumentation. .. ..

Referenz-URL

Arquillian Guides

Recommended Posts

Java EE Test (CDI / Interceptor) mit Arquillian
Erstellen Sie eine E2E-Testumgebung mit Selenium (Java).
Aktivieren Sie Java EE mit NetBeans 9
[Java EE] Implementieren Sie den Client mit WebSocket
[Java] Testen Sie private Methoden mit JUnit
One-JAR Java EE-Anwendung mit WebSphere Liberty
Einführung eines automatisierten Java-Tests mit JUnit 5 + Gradle
Primzahlbeurteilung Java
[Java] So testen Sie, ob es in JUnit null ist
[CircleCI 2.0] [Java] [Maven] [JUnit] Aggregieren Sie die JUnit-Testergebnisse mit CircleCI 2.0
Einführung automatisierter Java-Tests mit JUnit 5 + Apache Maven
Erstellen und testen Sie Java + Gradle-Anwendungen mit Wercker
Führen Sie Maven unter Java 8 aus, während Sie unter Java 6 kompilieren und unter Java 11 testen
Erstellen Sie mit Docker x Cypress eine E2E-Testumgebung
Serverloses Java EE beginnend mit Quarkus und Cloud Run
Installieren Sie Java mit Homebrew
Integrationstest mit Gradle
Wechseln Sie die Plätze mit Java
Installieren Sie Java mit Ansible
Bequemer Download mit JAVA
Java Unit Test Library-Arterien-Probe
Schalten Sie Java mit direnv
[Schienen] Test mit RSpec
Testen Sie Nokogiri mit Rspec.
Java-Download mit Ansible
Automatisch mit Messgerät testen
Lasttest mit JMeter
Lass uns mit Java kratzen! !!
Machen Sie einen Unit-Test mit Junit.
Erstellen Sie Java mit Wercker
Endian-Konvertierung mit JAVA
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.
[Java] Ich möchte Standardeingabe und Standardausgabe mit JUnit testen