我如何覆盖 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 的情况。
我有一个这样的 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 的情况。