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
Java EE Test Anfänger
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>
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;
}
}
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.
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.
Arquillian macht es einfach, CDI und Intercptor zu testen. Bitte probieren Sie es aus.
Der Nachteil ist der Mangel an Dokumentation. .. ..
Recommended Posts