[Maven & Arquillian] Projekt bekanntgeben

Diskutiere [Maven & Arquillian] Projekt bekanntgeben im Application Tier Forum; Hallo, ich hoff jemand kennt sich mit meiner Problematik aus. Ich möchte meine Arquillian-Tests in ein separates Maven-Projekt legen....

  1. Smoothi
    Smoothi Neues Mitglied
    Hallo,

    ich hoff jemand kennt sich mit meiner Problematik aus.

    Ich möchte meine Arquillian-Tests in ein separates Maven-Projekt legen.
    Soweit ich weiß, muss ich das Hauptprojekt als Dependency in die pom.xml schreiben.

    Weiß jemand, wie ich das im Detail mache, sodass ich meine CDI-Klassen in das Arquillian-Projekt injizieren kann?
     
  2. Vielleicht hilft dir dieser Kurs hier weiter --> (hier klicken)
  3. Smoothi
    Smoothi Neues Mitglied
    ok, habs hinbekommen:
    Code (Text):

    <dependency>
        <groupId>[Projektname]</groupId>
        <artifactId>[Projektname]</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
     
    jetzt brauch ich nur noch eine Möglichkeit, dass das ganze beim Testen deployed wird.
     
  4. FArt
    FArt Neues Mitglied
  5. Smoothi
    Smoothi Neues Mitglied
    Danke ersteinmal... aber das hilft mir glaube ich nicht weiter. ;)

    Ich werd mal etwas genauer:

    Ich habe 2 Projekte, bank-swt (Hauptprojekt) und arquillian-swt (enthält nur die Tests)

    Die Testprojekt hat folgende pom.xml:
    [XML]
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
    http://maven.apache.org/POM/4.0.0
    http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>de.java.ArquillianTutorial</groupId>
    <artifactId>arquillian-swt</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>de.java.ArquillianTutorial</name>

    <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <build>
    <plugins>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
    <source>1.6</source>
    <target>1.6</target>
    </configuration>
    </plugin>
    </plugins>
    </build>

    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>org.jboss.arquillian</groupId>
    <artifactId>arquillian-bom</artifactId>
    <version>1.0.3.Final</version>
    <scope>import</scope>
    <type>pom</type>
    </dependency>
    </dependencies>
    </dependencyManagement>

    <dependencies>
    <dependency>
    <groupId>org.jboss.spec</groupId>
    <artifactId>jboss-javaee-6.0</artifactId>
    <version>1.0.0.Final</version>
    <type>pom</type>
    <scope>provided</scope>
    </dependency>

    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.8.1</version>
    <scope>test</scope>
    </dependency>

    <dependency>
    <groupId>org.jboss.arquillian.junit</groupId>
    <artifactId>arquillian-junit-container</artifactId>
    <scope>test</scope>
    </dependency>

    <dependency>
    <groupId>org.jboss.arquillian.container</groupId>
    <artifactId>arquillian-weld-ee-embedded-1.1</artifactId>
    <version>1.0.0.CR3</version>
    <scope>test</scope>
    </dependency>

    <dependency>
    <groupId>org.jboss.weld</groupId>
    <artifactId>weld-core</artifactId>
    <version>1.1.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>

    <dependency>
    <groupId>bank-swt</groupId>
    <artifactId>bank-swt</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    </dependency>
    </dependencies>
    </project>
    [/XML]

    die letzte Dependency ist für das Hauptprojekt... was mit der Versionsnummer aufsich hat, versteh ich nicht. Damit geht es aber...

    Das Hauptprojekt war zunächst eine normales JavaEE-Projekt und ich habe es in ein Maven-Projekt umgewandelt. An der pom.xml habe ich nichts geändert:
    [XML]
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>bank-swt</groupId>
    <artifactId>bank-swt</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <build>
    <sourceDirectory>JavaSource</sourceDirectory>
    <testSourceDirectory>Test</testSourceDirectory>
    <resources>
    <resource>
    <directory>JavaSource</directory>
    <excludes>
    <exclude>**/*.java</exclude>
    </excludes>
    </resource>
    </resources>
    <plugins>
    <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
    <source>1.6</source>
    <target>1.6</target>
    </configuration>
    </plugin>
    </plugins>
    </build>
    </project>
    [/XML]

    Ich habe also anhand des Arquillian-Tutorials noch folgende Klassen erstellt:

    Einen Greeter, der im Hauptprojekt liegt:
    Code (Text):

    public class Greeter {
        public void greet(PrintStream to, String name) {
            to.println(createGreeting(name));
        }

        public String createGreeting(String name) {
            return "Hello, " + name + "!";
        }
    }
     
    und die Testklasse (natürlich im Testprojekt) dazu:
    Code (Text):

    @RunWith(Arquillian.class)
    public class GreeterTest {

        @Deployment
        public static JavaArchive createDeployment() {
            return ShrinkWrap.create(JavaArchive.class)
                .addClass(Greeter.class)
                .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
        }

        @Inject
        Greeter greeter;

        @Test
        public void should_create_greeting() {
            Assert.assertEquals("Hello, Earthling!",
            greeter.createGreeting("Earthling"));
            greeter.greet(System.out, "Earthling");
        }
    }
     
    Das Ganze funktioniert wunderbar und der Test wird erfolgreich ausgeführt.

    Problem ist, wenn ich beispielsweise eine Crud-Methode testen will:
    Code (Text):

    @RunWith(Arquillian.class)
    public class CRUDTest {

        @Deployment
        public static JavaArchive createDeployment() {
            return ShrinkWrap.create(JavaArchive.class)
                .addClass(BankCRUD.class)
                .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
        }

        @Inject
        BankCRUD bankCrud;

        @Test
        public void testBank() {
            Bank bank = new Bank();
            bank.setName("Testbank");
           
            bankCrud.save(bank);
        }
    }
     
    (ein Assert hab ich natürlich noch nicht... ich will den Eintrag ersteinmal auf die Datenbank bekommen)

    In Eclipse habe ich eine JBoss.7.1.1-Instance als Server eingerichtet, aber ich bekomm es einfach nicht hin, dass der Test genau da ausgeführt wird und ich auf die Datenbank zugreifen kann.

    :/
     
    Zuletzt bearbeitet: 5. Dez. 2012
  6. FArt
    FArt Neues Mitglied
  7. Smoothi
    Smoothi Neues Mitglied
    Kurz: Es handelt isch um ein Bankprojekt - Banken anlegen, Konten anlegen, Überweisungen etc...

    Die BankCRUD stellt einfach nur CRUD-Methoden zur Verfügung. Zunächst einmal wird von folgender Elternklasse geerbt, da die CRUD-Methoden für jedes Objekt gleich sind.

    Code (Text):

    public abstract class AbstractCRUDBean<T extends IEntityBase, E extends EntityManager> implements IAbstractCRUDBean<T, E> {
        private static final long serialVersionUID = 1L;

        abstract E getEntityManager();

        @Override
        public void save(T instance) {
            if (isManaged(instance)) {
                getEntityManager().merge(instance);
            } else {
                getEntityManager().persist(instance);
            }
        }

        public boolean isManaged(T instance) {
            if (instance != null) {
                if (instance.getId() > 0) {
                    return true;
                }
            }
            return false;
        }

        @Override
        public T createInstance() {
            try {
                return getClassType().newInstance();
            } catch (Exception e) {
                Logger.getLogger(AbstractCRUDBean.class.getSimpleName()).log(Level.ERROR, e.getMessage());
            }
            return null;
        }

        @SuppressWarnings("unchecked")
        private Class<T> getClassType() {
            ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass();
            return (Class<T>) parameterizedType.getActualTypeArguments()[0];
        }
    }
     
    (habe ein paar Methoden der übersichthalber weggelassen.

    Die BankCRUD selber sieht so aus:
    Code (Text):

    @Stateful
    public class BankCRUD extends AbstractCRUDBean<Bank, EntityManager>{
        private static final long serialVersionUID = 1L;
       
        @PersistenceContext(type=PersistenceContextType.EXTENDED)
        private EntityManager entityManager;
       
        @Override
        public EntityManager getEntityManager() {
            return entityManager;
        }
    }
     
    Ich lege also eine Bank-Entity an und speicher diese in der Datenbank. Die Ganze CDI-Sache funktioniert in der Hauptanwendung schon (die größtenteils fertig ist).

    Wie gesagt, das Problem liegt dabei, dass die Tests derzeit lokal aufgerufen werden. Mit dem Greeter geht das, da dieser nur eine Ausgabe an die Konsole enthält. Für die CRUD-Funktionen benötige ich aber die Verbindung zu meiner PostGres-Datenbank. Also muss das Hauptprojekt und das Testprojekt beim Testen auf den Server deployed und dann ausgeführt werden....und das bekomm ich nicht hin. :/
     
  8. FArt
    FArt Neues Mitglied
    Die Antwort wäre also gewesen, dass es sich um ein SFSB handelt und du nicht weißt, wie du mit Arquillian die Datasource bzw. den persistent Layer konfigurierst, richtig?

    Das sollte helfen:
    Testing Java Persistence · Arquillian Guides

    Wenn ich mir dein SFSB so anschaue, drängt sich mir der Verdacht auf, dass das Design hier suboptimal ist.

    Warum benötigst du ein SFSB? Die sollte man so weit es geht vermeiden.
    Die Ableitung (zusammen mit den generischen Anteilen) kommt mir auch ein wenig ... seltsam vor. Ich kenne das gesamt Design natürlich nicht, aber auch hier würde ich mal ein Review empfehlen.

    Kleinigkeiten: Der Klassenname BankCRUD ist ... unschön. Die UID auch...
     
  9. Smoothi
    Smoothi Neues Mitglied
    Das SFSB benötige ich wegen dem LazyLoading von Hibernate. Hatte erst ein SLSB und keinen Extended-PersC und das erschien mir performanter als den FetchType auf EAGER zu setzen. ;)

    Die Architektur könnte noch etwas überarbeitet werden. Sollte aber im Großen und Ganzen passen - bzw. bekam ich das sowieso mehr oder weniger etwas vorgeschrieben. Wieso, weshalb, warum würde jetzt etwas ausarten. ;)

    Die Benennung find ich auch noch nicht optimal, werde ich nach den Tests aber erst ändern, weil ich damit fertig werden muss (Bachelorarbeit, wird ein Lehrprojekt fürs Masterstudium). Ein bißchen Refactoring sollte dann nicht das Problem sein. Konnte mich mit meinem Prof aber noch nicht wirklich einigen wie die Dinger sinnvoll heißen sollen. DAO wollte er nicht ;)

    Naja und die UID ist automatisch generiert von Eclipse.

    Aber wie gesagt... Optimierung mach ich zum Schluss. Wenn ich das mit dem Testen hinbekomme, ist der Rest nicht mehr schlimm. ;)

    Ich schau mal ob mir das hilft..Danke erstmal
     
  10. FArt
    FArt Neues Mitglied
    Ich antworte mal prinzipiell auf die Aussagen.

    Schlechter Ansatz. Ein SFSB, welches man vermeiden sollte wo möglich, verwenden, um ein offzielles Feature einer gebräuchlichen API nicht zu verwenden, weil man vermutet, dass es so besser ist.... aua.

    Der erste Ansatz sollte der mit dem guten Design sein. Danach gibt es noch Möglichkeiten der Konfiguration (Hibernate oder DB). Danach kann man, wenn man bewiesenermaßen damit Probleme hat, davon abweichen. Aber nur nachdem man das Problem analysiert und eine passende Lösung gefunden hat.

    Das kommt im wahren Leben auch vor. Ist aber dennoch diskussionswürdig (das würde ich von einem Mitarbeiter erwarten, denn der sollte mitdenken).

    Mein Prof hätte so was angemeckert. Die Software überprüfen ist nicht so einfach. Der Name einer Klasse fällt aber sofort ins Auge. Im wahren Leben liest man mehr fremden Code, als man Code schreibt. Da sind sinnvolle Klassennamen wichtig.

    Andere IDEs generieren hier die UID, die auch das Javatool anhand der Signatur berechnen würde.

    Optimierungen sollte man auch am Schluss machen.

    Bitte.
     
  11. Smoothi
    Smoothi Neues Mitglied
    Nein nein... ganz so ist es nicht. Ich musste nur das Teil erstmal zum Laufen haben, damit ich weiter machen kann. Darüber mach ich mir zum Schluss nochmal Gedanken. Aber kann mich zwischendrin nicht ewig damit aufhalten. :)

    Diesbezüglich hatte ich mit meinem Prof genug Diskussionen. Die aktuelle Lösung habe ich von einem JavaTrainer und sollte ich erstmal so belassen.

    Auch hier gab es ewige Diskussionen. Im Großen- und Ganzen habe ich aber den Standardweg genommen. Sprich Daten-Schicht, DAO-Schicht, Service-Schicht, Präsentations-Schicht... Diese abstrakte Klasse find ich dennoch ziemlich übersichtlich. ;)

    Am Ende muss ich mich trotzdem nach dem Wunsch des Kunden (in dem Fall mein Prof) richten. Trotzdem lass ich nichts unkommentiert. ;)

    Wie gesagt...die Optimierung mach ich zum Schluss...das heißt auch hier und da mal eine Bezeichnung ändern.
     
Die Seite wird geladen...

[Maven & Arquillian] Projekt bekanntgeben - Ähnliche Themen

[Maven] ZIP Deployment Tutorial
[Maven] ZIP Deployment Tutorial im Forum Bücher, Tutorials und Links
[Maven] cannot find plugins
[Maven] cannot find plugins im Forum IDEs und Tools
[Maven] Depencies mit in jar übernehmen
[Maven] Depencies mit in jar übernehmen im Forum IDEs und Tools
[Maven Pluginentwicklung] - Plugin das nur auf Parent pom läuft
[Maven Pluginentwicklung] - Plugin das nur auf Parent pom läuft im Forum Deployment
[Maven] neuerdings "No plugin found for prefix ..." errors
[Maven] neuerdings "No plugin found for prefix ..." errors im Forum Deployment
Thema: [Maven & Arquillian] Projekt bekanntgeben