第 7 章 模拟 CDI Bean


Quarkus 允许您模拟特定测试的某些 CDI Bean。

您可以使用以下方法之一模拟对象:

  • 覆盖您要在 src/test/java 目录中带有类模拟的 bean,并将 @Alternative@Priority(1) 注释放在 bean 上。
  • 使用 io.quarkus.test.Mock stereotype 注解。@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";
        }
    
    }
    Copy to Clipboard Toggle word wrap
  2. 创建一个类 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();
        }
    }
    Copy to Clipboard Toggle word wrap
  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());
        }
    }
    Copy to Clipboard Toggle word wrap
  4. 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";
        }
    }
    Copy to Clipboard Toggle word wrap
    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";
        }
    }
    Copy to Clipboard Toggle word wrap
  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());
        }
    }
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat