第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
アノテーションを使用して外部サービスをモック化する方法を説明します。
手順
以下の例に示すような
src/main/java
ディレクトリーにExternalService
を作成します。package org.acme.quickstart; import javax.enterprise.context.ApplicationScoped; @ApplicationScoped public class ExternalService { public String service() { return "external"; } }
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(); } }
以下の例に示すような
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()); } }
@Alternative
アノテーションを使用するsrc/test/java
にMockExternalService
を作成します。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"; } }
テストで、アサートされた文字列を
"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()); } }