9

Arquillian を使用して、明示的なローカルおよびリモート インターフェイスを持つステートレス セッション Bean をテストします。しかし、テストでは、Arquillian はローカル インターフェースのタイプを持つフィールドに何も「注入」しませんが、リモート インターフェースに対しては機能します。

@Stateless
public class TestServiceImpl implements TestServiceLocal, TestServiceRemote {
    public String greet() {
        return "hallo";
    }
}

リモート インターフェイス:

@Remote
public interface TestServiceRemote {
    public String greet();
}

ロケール インターフェイス:

@Local
public interface TestServiceLocal {
    public String greet();
}

そして、これはテストです:

@RunWith(Arquillian.class)
public class GenericEntityDaoEjbIntegrationTest {

    @Deployment
    public static JavaArchive createTestArchive()
                  throws UnsupportedEncodingException {
        return ShrinkWrap.create(JavaArchive.class, "test.jar")
                .addClasses(
                        TestServiceLocal.class,
                        TestServiceRemote.class,
                        TestServiceImpl.class);
    }

    @EJB
    private TestServiceLocal testServiceLocal;

    @EJB
    private TestServiceRemote testServiceRemote;

    //Will Fail
    @Test
    public void testTestServiceLocal() {
        assertNotNull(this.testServiceLocal);
    }

    //Success    
    @Test
    public void testTestServiceRemote() {
        assertNotNull(this.testServiceRemote);
    }    
}

私は arquillian-glassfish-embedded 1.0.0.CR2、glassfish-embedded-all 3.1 および arquillian-junit-container 1.0.0.CR5 を使用しています。私の pom の関連部分は次のとおりです。

    <!-- arquillian test -->
    <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.arquillian.container</groupId>
        <artifactId>arquillian-container-spi</artifactId>
        <version>1.0.0.CR5</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.arquillian.container</groupId>
        <artifactId>arquillian-glassfish-embedded-3.1</artifactId>
        <version>1.0.0.CR2</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish.extras</groupId>
        <artifactId>glassfish-embedded-all</artifactId>
        <version>3.1</version>
        <scope>test</scope>
    </dependency>

これは、ログ ファイルの関連部分です (例外は含まれていません)。

10.04.2012 15:38:16 com.sun.ejb.containers.BaseContainer initializeHome
INFO: Portable JNDI names for EJB TestServiceImpl : [java:global/test/TestServiceImpl!de.test.service.TestServiceRemote, java:global/test/TestServiceImpl!de.test.service.TestServiceLocal]
10.04.2012 15:38:16 com.sun.ejb.containers.BaseContainer initializeHome
INFO: Glassfish-specific (Non-portable) JNDI names for EJB TestServiceImpl : [de.test.service.TestServiceRemote, de.test.service.TestServiceRemote#de.test.service.TestServiceRemote]
10.04.2012 15:38:16 com.sun.enterprise.web.WebApplication start
INFO: WEB0671: Loading application [test] at [/test]
10.04.2012 15:38:16 org.glassfish.deployment.admin.DeployCommand execute
INFO: test was successfully deployed in 11.844 milliseconds.

私の間違いは何ですか?ロケール インターフェイス用に注入されたインスタンスを取得するには、何を変更する必要がありますか?

4

3 に答える 3

14

次のいずれかを使用できます。

  • beans.xmlデプロイメントにファイルを追加します。

    return ShrinkWrap.create(JavaArchive.class, "test.jar")
                    .addClasses(
                            TestServiceLocal.class,
                            TestServiceRemote.class,
                            TestServiceImpl.class)
                    .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
    

    これにより、Arquillian の CDITestEnricher が有効になります。これは、EJBTestEnricher よりもはるかに優れています。@Inject注釈 (明らかに)を処理できますが@Resource@EJB注釈も同様に処理できます (CDI 仕様のリソース注入に関するセクションを参照してください)。コンテナーは@EJB、テスト クラス インスタンス内の両方の注釈付きフィールドを注入ポイントとして扱い、依存関係を注入します。

  • デプロイされた Bean の移植可能な JNDI 名を持つフィールドmappedNameのアノテーションのプロパティを指定します。@EJBあなたの場合、次のようになります。

    @EJB(mappedName="java:global/test/TestServiceImpl!com.acme.TestServiceLocal")
    private TestServiceLocal testServiceLocal;
    

    移植可能な JNDI 名が、デプロイメント用に生成されたものと同じであることを確認する必要があります。「com.acme.TestServiceLocal」インターフェイス用に生成されたものを指定しただけです。

于 2012-04-11T11:30:34.713 に答える
5

答えに加えて、正しい@Deployment設定を使用していることも確認する必要があります。ローカルに注入するには、持っていることを確認する必要があります@Deployment(testable=true)(これがデフォルトであることに注意してください)。

Aquillian docsから:

コンテナ内モード: @Deployment(testable = true)

上で述べたように、@Deployment を再パッケージ化し、いくつかの Arquillian サポート クラスを追加して、コンテナー内で実行する必要があります。これにより、テストと通信し、テストを強化し、テストをリモートで実行することができます。このモードでは、テストはリモート コンテナーで実行されます。Arquillian はデフォルトでこのモードを使用します。

@Deployment を指定した場合にパッケージ化プロセスで予想される出力の概要については、完全なプロトコル リファレンスを参照してください。

クライアントモード: @Deployment(testable = false)

今、このモードは簡単な部分です。テストの実行を再パッケージ化してオーバーライドするコンテナー内モードとは対照的に、as-client モードは可能な限りほとんど実行しません。@Deployment を再パッケージしたり、テストの実行をリモート サーバーに転送したりしません。テスト ケースは期待どおりに JVM で実行されており、クライアントが見るように、外部からコンテナーを自由にテストできます。Arquillian が行う唯一のことは、 @Deployment のライフサイクルを制御することです。

as client モードを使用してサーブレットを呼び出す例を次に示します。

これはOPには役立ちませんが(正しい設定がありました)、私と同じようにGoogleから到着した人に役立つことを願っています.

于 2014-03-05T13:58:16.630 に答える
1

TestServiceImpl->TestServiceBean を変更してみてください。埋め込まれたグラスフィッシュには Bean 名に特定の要件があるようです

于 2012-06-01T21:43:12.697 に答える