第 7 章 模拟 CDI Bean
Quarkus 允许您模拟特定测试的某些 CDI Bean。
您可以使用以下方法之一模拟对象:
-
覆盖您要在
src/test/java目录中带有类模拟的 bean,并将@Alternative和@Priority(1)注释放在 bean 上。 -
使用
io.quarkus.test.Mockstereotype 注解。@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"; } }创建一个类
UsesExternalService,它在src/main/java目录中使用ExternalService: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()); } }在
src/test/java中创建使用@Alternative注释的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。
注意您可以使用
@Mock注释而不是@Alternative、@Priority(1)和@Dependent注释。以下示例演示了如何创建使用
@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()); } }