如何覆盖 Quarkus 中的 CDI bean 进行测试?

geo*_*and 5 quarkus

我有一个 CDI bean,如下所示:

@Dependent
class Parser {

  String[] parse(String expression) {
     return expression.split("::");
  }
}
Run Code Online (Sandbox Code Playgroud)

它被注入到另一个 bean 中,如下所示:

@ApplicationScoped
class ParserService {

  @Inject
  Parser parser;

  //...
}
Run Code Online (Sandbox Code Playgroud)

我想做的是继续Parser在我的常规代码中使用,但我想使用“模拟”来进行测试。我怎样才能做到这一点?

geo*_*and 7

在这种情况下,需要做的就是在 test 目录中创建 bean,如下所示:

@Alternative
@Priority(1)
@Singleton
class MockParser extends Parser {

    String[] parse(String expression) {
        // some other implementation
    }
}
Run Code Online (Sandbox Code Playgroud)

这里@Alternative@Priority是 Quarkus 将用来确定MockParser将使用的CDI 注释Parser(当然仅用于测试)。

更多详细信息可以在扩展作者指南中找到。

注意@Alternarive:和的使用@Priority当然不仅限于测试代码。它们可用于任何使用“覆盖”bean 的情况。