第6章 CDI Bean のモック化


Quarkus により、特定のテスト用に一部の CDI Bean をモック化できます。

以下の方法の 1 つを使用して、オブジェクトをモック化できます。

  • src/test/java ディレクトリーのクラスでモック化する Bean を上書きし、@Alternative および @Priority(1) のアノテーションを Bean に配置します。
  • io.quarkus.test.Mock ステレオタイプアノテーションを使用します。@Mock アノテーションには @Alternative@Priority(1)、および @Dependent のアノテーションが含まれます。

以下の手順では、@Alternative アノテーションを使用して外部サービスをモック化する方法を説明します。

手順

  1. 以下の例に示すような src/main/java ディレクトリーに ExternalService を作成します。

    package org.acme.quickstart;
    
    import javax.enterprise.context.ApplicationScoped;
    
    @ApplicationScoped
    public class ExternalService {
    
        public String service() {
            return "external";
        }
    
    }
  2. src/main/java ディレクトリーで ExternalService を使用する UsesExternalService クラスを作成します。

    package org.acme.quickstart;
    
    import javax.enterprise.context.ApplicationScoped;
    import javax.inject.Inject;
    
    @ApplicationScoped
    public class UsesExternalService {
    
        @Inject
        ExternalService externalService;
    
        public String doSomething() {
            return externalService.service();
        }
    }
  3. 以下の例に示すような src/test/java ディレクトリーにテストを作成します。

    package org.acme.quickstart;
    
    import javax.inject.Inject;
    
    import io.quarkus.test.junit.QuarkusTest;
    import org.junit.jupiter.api.Assertions;
    import org.junit.jupiter.api.Test;
    
    @QuarkusTest
    class UsesExternalServiceTest {
    
        @Inject
        UsesExternalService usesExternalService;
    
        @Test
        public void testDoSomething() {
            Assertions.assertEquals("external", usesExternalService.doSomething());
        }
    }
  4. @Alternative アノテーションを使用する src/test/javaMockExternalService を作成します。

    package org.acme.quickstart;
    
    import javax.annotation.Priority;
    import javax.enterprise.context.ApplicationScoped;
    import javax.enterprise.inject.Alternative;
    
    @Alternative
    @Priority(1)
    @ApplicationScoped
    public class MockExternalService extends ExternalService { 1
    
        @Override
        public String service() {
            return "mock";
        }
    }
    1
    ExternalService が使用されている場所に、MockExternalService が注入されます。この例では、MockExternalService は、UsesExternalService で使用されます。
    注記

    @Alternative@Priority(1) および @Dependent のアノテーションの代わりに @Mock アノテーションを使用できます。

    以下の例は、@Mock アノテーションを使用する MockExternalService クラスを作成する方法を示しています。

    import javax.enterprise.context.ApplicationScoped;
    
    import io.quarkus.test.Mock;
    
    @Mock
    @ApplicationScoped
    public class MockExternalService extends ExternalService {
    
        @Override
        public String service() {
            return "mock";
        }
    }
  5. テストで、アサートされた文字列を "external" から "mock" に変更します。

    package org.acme.quickstart;
    
    import javax.inject.Inject;
    
    import io.quarkus.test.junit.QuarkusTest;
    import org.junit.jupiter.api.Assertions;
    import org.junit.jupiter.api.Test;
    
    @QuarkusTest
    class UsesExternalServiceTest {
    
        @Inject
        UsesExternalService usesExternalService;
    
        @Test
        public void testDoSomething() {
            Assertions.assertEquals("mock", usesExternalService.doSomething());
        }
    }
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.