2012-09-08 15 views
6

私はCDIと一緒にTomcat 7を使いました。そのためには、Knappsack Maven Archetypesのjee6-servlet-minimal-archetypeを使いました。Tomcat + CDI + Arquillian

私はCDI BeanをテストするためにArquillianを使用したいと思いますが、かなりの時間を捜しても、トピックに関する多くの問題が見つかりました。

誰かが、Tomcat 7のCDIテストにArquillianを使用して、動作設定(特に右のpom.xmlを使用)を指摘できますか?


編集2012年9月11日: としては、以下のコメントで指摘し、私は私の問題を解決し得ると思い、私は全体のセットアップを理解する私を助けるために誰かを必要とするのではなく、解決しようとある時点で特定の例外が発生します。

tomcat 7にCDI Beanがあり、埋め込み管理されたコンテナと管理されたコンテナの両方のすべての注入メカニズムでテストできるようにするには、pom.xmlとテストクラスをどのようにする必要がありますか? (ところで、なぜそれが6のためになっているもはやとしてTomcat 7のためのリモート・コンテナアダプタがありません?)

私はすでにtomcat 6 exampleを適応しようとしたが、それはTomcat上で動作させることができなかった7

答えて

3

残念ながら、私はまだ問題の実例を見つけたり、話したりしていませんでしたが、私がここに示したいものを考え出すことができました。この問題はエキゾチックなものではないと仮定し、多分誰かがそれを見渡し、何かが違うべきである場合のヒントを私に与えるかもしれない。

/pom.xml(Tomcatの7 [7.0.30]と[3.7] Eclipseで使用可能な、プロジェクトのプロパティ/展開アセンブリは、テストクラス/リソースが含まれていないことを確認してください):

<?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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.mycompany</groupId> 
    <artifactId>cditomcat</artifactId> 
    <packaging>war</packaging> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>cditomcat</name> 
    <description>This pom is the base for a project using JSF2+CDI on a tomcat 7 and Arquillian for tests.</description> 

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

    <dependencies> 
     <!-- Java EE Dependencies --> 
     <dependency> 
      <groupId>com.sun.xml.ws</groupId> 
      <artifactId>jaxws-rt</artifactId> 
      <version>2.2.7</version> 
     </dependency> 

     <dependency> 
      <groupId>javax.faces</groupId> 
      <artifactId>jsf-api</artifactId> 
      <version>2.0</version> 
      <scope>compile</scope> 
     </dependency> 

     <dependency> 
      <groupId>com.sun.faces</groupId> 
      <artifactId>jsf-impl</artifactId> 
      <version>2.0.2-b10</version> 
      <scope>compile</scope> 
     </dependency> 

     <dependency> 
      <groupId>javax.validation</groupId> 
      <artifactId>validation-api</artifactId> 
      <version>1.0.0.GA</version> 
      <scope>compile</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator</artifactId> 
      <version>4.0.0.GA</version> 
      <scope>compile</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.jboss.weld.servlet</groupId> 
      <artifactId>weld-servlet</artifactId> 
      <version>1.1.4.Final</version> 
     </dependency> 

     <!-- Test dependencies --> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.10</version> 
      <scope>test</scope> 
     </dependency> 

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

     <dependency> 
      <groupId>org.jboss.shrinkwrap.container</groupId> 
      <artifactId>shrinkwrap-container-tomcat-60</artifactId> 
      <version>1.0.0-beta-1</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.jboss.shrinkwrap</groupId> 
      <artifactId>shrinkwrap-api</artifactId> 
      <version>1.0.0-cr-1</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.jboss.shrinkwrap</groupId> 
      <artifactId>shrinkwrap-spi</artifactId> 
      <version>1.0.0-cr-1</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.jboss.shrinkwrap.descriptors</groupId> 
      <artifactId>shrinkwrap-descriptors-api</artifactId> 
      <version>1.1.0-beta-1</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.jboss.shrinkwrap.descriptors</groupId> 
      <artifactId>shrinkwrap-descriptors-impl</artifactId> 
      <version>1.1.0-beta-1</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>1.7.0</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 

    <build> 
     <finalName>cditomcat</finalName> 
     <testSourceDirectory>src/test/java</testSourceDirectory> 

     <plugins> 
      <!-- Facilitates downloading source and javadoc in Eclipse --> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-eclipse-plugin</artifactId> 
       <version>2.8</version> 
       <configuration> 
        <wtpversion>2.0</wtpversion> 
        <downloadSources>true</downloadSources> 
        <downloadJavadocs>true</downloadJavadocs> 
       </configuration> 
      </plugin> 

      <!-- Ensures we are compiling at 1.6 level --> 
      <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> 

      <!-- Tomcat plugin for embedded tomcat --> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>tomcat-maven-plugin</artifactId> 
       <version>1.1</version> 
       <configuration> 
        <path>/${project.build.finalName}</path> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

    <profiles> 
     <profile> 
      <id>tc7-embedded</id> 
      <activation> 
       <activeByDefault>true</activeByDefault> 
      </activation> 

      <build> 
       <testResources> 
        <testResource> 
         <directory>src/test/resources</directory> 
        </testResource> 
        <testResource> 
         <directory>src/test/resources/embedded</directory> 
        </testResource> 
       </testResources> 
      </build> 

      <dependencies> 
       <dependency> 
        <groupId>org.jboss.arquillian.container</groupId> 
        <artifactId>arquillian-tomcat-embedded-7</artifactId> 
        <version>1.0.0.CR3</version> 
        <scope>test</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.apache.tomcat.embed</groupId> 
        <artifactId>tomcat-embed-core</artifactId> 
        <version>7.0.19</version> 
        <scope>provided</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.apache.tomcat.embed</groupId> 
        <artifactId>tomcat-embed-jasper</artifactId> 
        <version>7.0.19</version> 
        <scope>provided</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.eclipse.jdt.core.compiler</groupId> 
        <artifactId>ecj</artifactId> 
        <version>3.7</version> 
        <scope>test</scope> 
       </dependency> 

       <!-- Provided scoped dependencies for embedded container --> 
       <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-catalina</artifactId> 
        <version>7.0.29</version> 
        <scope>provided</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-coyote</artifactId> 
        <version>7.0.29</version> 
        <scope>provided</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-jasper</artifactId> 
        <version>7.0.29</version> 
        <scope>provided</scope> 
       </dependency> 

       <dependency> 
        <groupId>javax.servlet</groupId> 
        <artifactId>servlet-api</artifactId> 
        <version>2.5</version> 
        <scope>provided</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.jboss.arquillian.container</groupId> 
        <artifactId>arquillian-container-test-spi</artifactId> 
        <version>1.0.2.Final</version> 
        <scope>test</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.jboss.arquillian.container</groupId> 
        <artifactId>arquillian-container-spi</artifactId> 
        <version>1.0.0.CR5</version> 
        <scope>test</scope> 
       </dependency> 
      </dependencies> 
     </profile> 

     <profile> 
      <id>tc7-managed</id> 
      <build> 
       <testResources> 
        <testResource> 
         <directory>src/test/resources</directory> 
        </testResource> 
        <testResource> 
         <directory>src/test/resources/managed</directory> 
        </testResource> 
       </testResources> 
      </build> 

      <dependencies> 
       <dependency> 
        <groupId>org.jboss.arquillian.container</groupId> 
        <artifactId>arquillian-tomcat-managed-7</artifactId> 
        <version>1.0.0.CR3</version> 
        <scope>test</scope> 
       </dependency> 

       <!-- Provided scoped dependencies for embedded container --> 
       <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-catalina</artifactId> 
        <version>7.0.29</version> 
        <scope>provided</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-coyote</artifactId> 
        <version>7.0.29</version> 
        <scope>provided</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-jasper</artifactId> 
        <version>7.0.29</version> 
        <scope>provided</scope> 
       </dependency> 

       <dependency> 
        <groupId>javax.servlet</groupId> 
        <artifactId>servlet-api</artifactId> 
        <version>2.5</version> 
        <scope>provided</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.jboss.arquillian.container</groupId> 
        <artifactId>arquillian-container-test-spi</artifactId> 
        <version>1.0.2.Final</version> 
        <scope>test</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.jboss.arquillian.container</groupId> 
        <artifactId>arquillian-container-spi</artifactId> 
        <version>1.0.0.CR5</version> 
        <scope>test</scope> 
       </dependency> 
      </dependencies> 
     </profile> 
    </profiles> 
</project> 

/src/main/webapp/WEB-INF/web.xml(私はまだバージョン2を使用しました。5):

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    version="2.5"> 
    <welcome-file-list> 
     <welcome-file>index.html</welcome-file> 
    </welcome-file-list> 
    <context-param> 
     <param-name>facelets.DEVELOPMENT</param-name> 
     <param-value>true</param-value> 
    </context-param> 
    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.jsf</url-pattern> 
    </servlet-mapping> 
    <listener> 
     <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class> 
    </listener> 
    <resource-env-ref> 
     <description>Object factory for the CDI Bean Manager</description> 
     <resource-env-ref-name>BeanManager</resource-env-ref-name> 
     <resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type> 
    </resource-env-ref> 

</web-app> 

/src/main/webapp/META-INF/context.xml(サーブレット内注射、リスナー、使用されていないフィルタ):

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
    <!-- disable storage of sessions across restarts --> 
    <Manager pathname=""/> 
    <Resource name="BeanManager" auth="Container" type="javax.enterprise.inject.spi.BeanManager" factory="org.jboss.weld.resources.ManagerObjectFactory"/> 
</Context> 

/src/main/resources/META-INF/beans.xml /src/test/resources/in-container-beans.xml (空のマーカーファイルは、アプリケーションとテストのために同じです):

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
     http://java.sun.com/xml/ns/javaee 
     http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> 
</beans> 

/src/test/resources/in-container-web.xml(組み込みおよび管理のために同じ):

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    version="2.5"> 

    <env-entry> 
     <env-entry-name>name</env-entry-name> 
     <env-entry-type>java.lang.String</env-entry-type> 
     <env-entry-value>Tomcat</env-entry-value> 
    </env-entry> 

    <listener> 
     <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class> 
    </listener> 

    <resource-env-ref> 
     <resource-env-ref-name>BeanManager</resource-env-ref-name> 
     <resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type> 
    </resource-env-ref> 
</web-app> 

/src/test/resources/in-container-context.xml(組み込みおよび管理のために同じ):

<Context> 
    <Resource name="BeanManager" auth="Container" 
     type="javax.enterprise.inject.spi.BeanManager" factory="org.jboss.weld.resources.ManagerObjectFactory" /> 
</Context> 

/src/test/resources/embedded/arquillian.xml(このファイルは唯一の組み込み用です) :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<arquillian xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://jboss.org/schema/arquillian" 
    xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd"> 

    <engine> 
     <property name="deploymentExportPath">target</property> 
    </engine> 
    <container qualifier="tomcat" default="true"> 
     <configuration> 
      <property name="tomcatHome">target/tomcat-embedded-7</property> 
      <property name="workDir">work</property> 
      <property name="appBase">webapps</property> 
      <property name="bindHttpPort">8889</property> 
      <property name="unpackArchive">true</property> 
     </configuration> 
    </container> 
</arquillian> 

/src/test/resources/managed/arquillian.xml(このファイルは、管理のみのためです):

... 
<role rolename="manager-gui" /> 
    <role rolename="manager-jmx" /> 
    <role rolename="manager-script" /> 
    <user username="tomcat" password="manager" 
     roles="manager-gui,manager-jmx, manager-script" /> 
... 
:コンテナ管理の展開が機能するために

<?xml version="1.0"?> 
<arquillian 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://jboss.org/schema/arquillian" 
     xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd"> 

    <container qualifier="tomcat" default="true"> 
     <configuration> 
      <property name="jmxPort">8099</property> 
      <property name="host">localhost</property> 
      <property name="port">8080</property> 
      <property name="user">tomcat</property> 
      <property name="pass">manager</property> 
     </configuration> 
    </container> 
</arquillian> 

は、Tomcatのtomcat-users.xmlファイルマネージャ、例えばを有効にするために拡張する必要があります

最後に、各arquillian test classは(私が使用して次のように展開方法を持たなければなりませんDサーブレット2.5):

... 
    @Deployment 
    @OverProtocol("Servlet 2.5") 
    public static WebArchive createDeployment() { 
     return ShrinkWrap 
       .create(WebArchive.class, "test.war") 
       .addClass(MyTest.class) 
       .addAsLibrary(
         MavenArtifactResolver 
           .resolve("org.jboss.weld.servlet:weld-servlet:1.1.4.Final")) 
       .addAsWebInfResource("in-container-beans.xml", "beans.xml") 
       .addAsManifestResource("in-container-context.xml", 
         "context.xml").setWebXML("in-container-web.xml"); 
    } 
... 

溶接がパッケージ化されなければならない、問題の参照例(編集区間)で行われるように、次のコードによって、私の場合、ローカルのMavenリポジトリから取得され:

public class MavenArtifactResolver { 
    private static final String LOCAL_MAVEN_REPO = 
      System.getProperty("user.home") + File.separatorChar + 
        ".m2" + File.separatorChar + "repository"; 

    public static File resolve(String groupId, String artifactId, String version) { 
     return new File(LOCAL_MAVEN_REPO + File.separatorChar + 
       groupId.replace(".", File.separator) + File.separatorChar + 
       artifactId + File.separatorChar + 
       version + File.separatorChar + 
       artifactId + "-" + version + ".jar"); 
    } 

    public static File resolve(String qualifiedArtifactId) { 
     String[] segments = qualifiedArtifactId.split(":"); 
     return resolve(segments[0], segments[1], segments[2]); 
    } 
} 
2

Tomcat 7(TomEE)のJava EE認定バージョンで動作する設定です。これは、CDIが含まれており、作業Arquillianアダプタのほんの一握りがあります。そのページはTomcatにリクエストを送信するために使用する権利のポートを取得するためのプロパティを使用して言及し

注意。無視してください。正しいアプローチは、あなたのテストケースで次のようなフィールドです:

@ArquillianResource 
private URL url; 

これは、Webアプリケーション、ポート、およびすべてのベースURLになります。

+0

私は既にTomEEについて聞いたことがありますが、私の場合は顧客の環境が設定されているので、これはできません。しかし、tomcat 7のためのアダプタがあるので、管理されていて、埋め込まれています。そして、tomcat + CDIの動作例があるので、3つすべてのセットアップがあることを願っています。 –

+0

また、プレーンなTomcat 7を起動し、OpenWebBeans、OpenEJBなどをデプロイしてからアプリケーションをデプロイする、アダプタのバージョンもあります。どのCDI実装を使用していますか? –

+0

私はWeldをJBoss 7(私の好みの環境)に付属しているので使用します。 –

2

ArkillianのTomcat-7管理コンテナのPOMを見ると、Weld-Servletがテストの依存関係として追加されます。

Weld JARは、ShrinkWrap Maven Dependency Resolverを使用してArquillian @Deployment defined in the test classesにロードされます。また、空のbeans.xmlファイルを展開に含める必要があります。注 - テストクラスに注入されたCDI Beanはありませんが、Weldを使用して@Resourceを注入します。

+0

おかげで、私はあなたが指摘したアイテムを適応しようとしたが、それはうまくいきませんでした。私はまた、[this](https://community.jboss.org/wiki/Tomcat6EmbeddedAndRemote)の記事を開始点として使用しました。これはTomcat 6の動作設定を示し、Tomcat 7に適用しようとしましたが動作しませんでした。あなたはいくつかの実際の例、または少なくともtomcat 7 arquillianアダプタとcdiの両方をカバーするpomを指摘できますか? –

+0

@Gezieferは、どのようなエラーあなたが見て、またはされているが失敗しているのですか? –

+0

事は、私は別のものを試して、別の例外を持っていることです(ClassNotFound、NoSuchMethod、...)、私は正確に何が必要であるかを知らずに依存関係を追加し続けます。だから恐れているが、私が1つの例外を掲示すれば、ここで解決され、次の1つにつながるかもしれない。最初は間違った方向に入ったことを知らない。だから、私は私の質問を延長しました、上記を参照してください。 –

関連する問題