Quarkus getting started unittest描述了如何模拟注入的服务。但是,当尝试将其应用于已注入的其余客户时,这似乎不起作用。
在我的应用程序中,要注入的class属性是这样定义的
@Inject
@RestClient
MyService myService;
在测试代码中,我创建了一个模拟服务,如下所示:
@Alternative()
@Priority(1)
@ApplicationScoped
public class MockMyService extends MyService {
@Override
public MyObject myServicemethos() {
return new MyObject();
}
}
请注意,此服务未注册或注释为RestClient。像这样运行我的单元测试会出现以下错误:
org.junit.jupiter.api.extension.TestInstantiationException: TestInstanceFactory [io.quarkus.test.junit.QuarkusTestExtension] failed to instantiate test class [...MyMediatorTest]: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.arc.deployment.ArcAnnotationProcessor#build threw an exception: javax.enterprise.inject.spi.DeploymentException: javax.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type ...MyService and qualifiers [@RestClient]
- java member: ...MyMediator#myService
- declared on CLASS bean [types=[java.lang.Object, ...MyMediator], qualifiers=[@Default, @Any], target=...MyMediator]
at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.invokeTestInstanceFactory(ClassTestDescriptor.java:314)
...
我可能可以通过添加额外的服务层来克服这一问题。但这就像是朝错误的方向前进。
我该如何解决。
亲切的问候,
杂种
答案 0 :(得分:1)
对于quarkus 1.1.0.Final版本(撰写本文时为最新版本),请使用@RegisterRestClient
@Alternative()
@Priority(1)
@ApplicationScoped
@RegisterRestClient
public class MockMyService extends MyService {
@Override
public MyObject myServicemethos() {
return new MyObject();
}
}
答案 1 :(得分:1)
使用@Mock注释
import io.quarkus.test.Mock;
import org.eclipse.microprofile.rest.client.inject.RestClient;
import javax.enterprise.context.ApplicationScoped;
@Mock
@ApplicationScoped
@RestClient
public class MockMyService extends MyService {
@Override
public MyObject myServicemethos() {
return new MyObject();
}
}
答案 2 :(得分:0)
您不需要另一个间接级别。
您可以简单地做到:
@Alternative()
@Priority(1)
@ApplicationScoped
@RestClient
public class MockMyService extends MyService {
@Override
public MyObject myServicemethos() {
return new MyObject();
}
}
请注意,我添加了@RestClient
批注。
答案 3 :(得分:0)
我只是遇到了同样的问题。我似乎遇到了文档更新和一些特殊情况,但是google搜索首先将我发送到这里,所以我将为以后的读者添加调查结果。
根据文档,您无需创建模拟类 https://quarkus.io/guides/getting-started-testing#using-injectmock-with-restclient
但可以像使用它
服务等级
@RegisterRestClient(configKey = "country-api")
@ApplicationScoped
public interface MyService
服务使用情况
@Inject
@RestClient
MyService myService;
像测试一样模拟它
@InjectMock
@RestClient
MyService myService;
到目前为止还不错,但是如果需要 configKey ,请遵循文档https://quarkus.io/guides/rest-client,您可能会完成
# Your configuration properties
country-api/mp-rest/url=https://restcountries.eu/rest #
!!country-api/mp-rest/scope=javax.inject.Singleton # /
在您的配置文件中。然后会遇到这些问题
Ability to use InjectMock on MicroProfile RestClient # 8622
Usage of InjectMock on MicroProfile RestClient # 9630
Error when trying to Test RestClient # 12585
表示:如果您将ConfigKey与RegisterRestClient一起使用,则必须注意不要
country-api/mp-rest/scope=javax.inject.Singleton #
位于配置文件中,该文件优先于MyService接口上的@ApplicationScoped