2015-07-02 26 views
9

Vor 3 Tagen habe ich den Arquillian-Leitfaden "Erste Schritte" abgeschlossen und entschieden, dass dies eine gute Sache für die Komponententests meines Teils eines CQRS-Systems wäre.CDI-Tests mit Arquillian

Leider hat sich dies als etwas weniger als geradlinig erwiesen. Ich habe die letzten 3 Tage gegoogelt und das Problem wurde durch keine der Lösungen gelöst, die für andere funktioniert haben.

Ich komme zu dem Schluss, dass das Problem mit meinem Code ist, obwohl ich nicht sehe, wie.

Meine Aufgabe besteht darin, einen Ereignis-Listener zu schreiben, der ein ActiveMQ-Thema auf Ereignisse abhört und dann die "Ansicht" in einer Mongo-DB aktualisiert.

Es wird viele Ereignisse im System geben, daher erschien es mir sinnvoll, eine abstrakte Basisklasse zu erstellen, die alle Ereignislistener erweitern.

Diese Basisklasse enthält den Mongo-Client und registriert sich das Thema. Es verwendet einen überladenen Getter für den Listenernamen, den es als Bean-Referenz in einer Kamelroute verwendet. Die Listener-Client-ID wird aus einem statischen Long generiert, der bei jeder Listener-Registrierung inkrementiert wird. Dadurch wird sichergestellt, dass jeder Listener alle Ereignisse sehen kann, die zum Thema gesendet wurden. Absicht ist, später einen Filter hinzuzufügen, um die Anzahl der empfangenen Ereignisse zu reduzieren.

Ich habe diesen Code erstellt und es von einem Timer generiert Ereignisthema Beiträge und alles funktioniert gut.

Das Problem damit ist eine Qualitätsanforderung, covertura 80% Code-Coverage durch Komponententests zu melden.

Meine Testanwendung ist kein Komponententest, daher beträgt meine Codeabdeckung 0%.

Ich bin zu Arquillian über ein paar andere Methoden der Komponententests in CDI gekommen, aber Arquillian scheint die beste Option zu sein, wenn ich es nur zur Arbeit bringen könnte.

Der Fehler Ich erhalte ist:

java.lang.IllegalStateException: Could not find beans for Type=class org.apache.deltaspike.core.impl.scope.window.WindowBeanHolder and qualifiers:[] 

I deltaspike im pom enthalten habe, habe ich es in die shrinkwrap Bereitstellung hinzugefügt

POM Extrakt

<dependency> 
    <groupId>org.apache.deltaspike.core</groupId> 
    <artifactId>deltaspike-core-api</artifactId> 
    <version>${deltaspike.version}</version> 
</dependency> 

<dependency> 
    <groupId>org.apache.deltaspike.core</groupId> 
    <artifactId>deltaspike-core-impl</artifactId> 
    <version>${deltaspike.version}</version> 
</dependency> 

<dependency> 
    <groupId>org.jboss.shrinkwrap.resolver</groupId> 
    <artifactId>shrinkwrap-resolver-impl-maven</artifactId> 
    <version>2.0.0</version> 
</dependency> 

Prüfklasse @RunWith (Arquillian.class) öffentliche Klasse ListenerTest {

AbstractEventListener listener = null ; 
    WindowBeanHolder w = new WindowBeanHolder(); 

    @Deployment 
    public static WebArchive createDeployment() { 
     return ShrinkWrap.create(WebArchive.class).addAsLibraries(Maven.resolver().loadPomFromFile("pom.xml") 
     .resolve("org.apache.deltaspike.core:deltaspike-core-api", 
       "org.apache.deltaspike.core:deltaspike-core-impl") 
     .withoutTransitivity().asFile()) 
     .addAsWebInfResource("beans.xml"); 
} 


    @Test 
    public void testExecute() { 
     Assert.assertNotNull(listener); 
    } 
} 

Mein beams.xml

<?xml version="1.0" encoding="UTF-8"?> 
    <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" 
    bean-discovery-mode="all"> 
</beans> 

Wie Sie mich selbst habe sehen können, versucht, die WindowBeanHolder zum Code hinzufügen.

Ich habe in den letzten Tagen viele Änderungen am Code vorgenommen. Ich habe nicht die volle Pom etc enthalten, da dies nicht benötigt wird, kann aber bei Bedarf hinzugefügt werden.

Wenn Sie einen Vorschlag haben, wohin ich von hier gehen kann, vielen Dank im Voraus.

+0

DeltaSpike selbst wird über Arquillian getestet. Ich würde ihre Einrichtung überprüfen. –

Antwort

0

Zusammenfassung der Datenbankschicht über eine Schnittstelle. Geben Sie einen Mongo-Impl für Prod, aber einen Unit-Testable Stateful "Dummy" zum Testen an.

Haben Sie alle Ihre Code beziehen sich auf die Schnittstelle und injizieren (ggf. mit Reflexion) die Dummy-impl, um Ihren Code vor dem Ausführen Ihrer Komponententests zu testen.

Verwandte Themen