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

How can I override a CDI bean in Quarkus for testing?

我有一个这样的 CDI bean:

@Dependent
class Parser {

  String[] parse(String expression) {
     return expression.split("::");
  }
}

它像这样注入到另一个 bean 中:

@ApplicationScoped
class ParserService {

  @Inject
  Parser parser;

  //...
}

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

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

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

    String[] parse(String expression) {
        // some other implementation
    }
}

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

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

注意@Alternarive@Priority的使用当然不仅仅限于测试代码。它们可以用于任何使用 "overriding" bean 的情况。