我在Quarkus中有一个作用域singleton的类。我试着用 quarkus 测试来模拟它:
@Path("api/rpo/registerdata/public/{filename}")
@RegisterRestClient(configKey = "gpo.upload")
@ClientHeaderParam(name = "Authorization", value = "{pe.dev.rpo.gpo.JwtStore.getBearer}")
public interface RpoService {
@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
Response upload(InputStream inputStream, @PathParam("filename") String filename);
}
我在应用程序中定义了范围。性能:
gpo.upload/mp-rest/scope=javax.inject.Singleton
当我在测试中注入它时,带有以下注解:
@InjectMock(convertScopes = true)
@RestClient
RpoService rpo;
我得到一个错误:the injected bean does not declare a CDI normal scope but: javax.inject.Singleton
Quarkus的文档提到,模拟@Singleton类是不可能的。但作为一种变通方法,@InjectMock(convertScopes = true)
可以将作用域更改为@ApplicationScoped,以便可以模拟它。但是,它在我的情况下不起作用。谁能告诉我为什么,也许能帮我解决问题?我的测试类:
@QuarkusTest
public class ExportServiceTest {
@Inject
ExportService exportService;
@InjectMock(convertScopes = true)
@RestClient
RpoService ax;
@Test
void test_upload() throws IOException {
File f = File.createTempFile( "some-prefix", "some-ext");
Path p= f.toPath();
FileInputStream inputStream = new FileInputStream(f);
String fileName ="randomstring";
Response mockResponse = mock(Response.class);
when(ax.upload(inputStream, fileName)).thenReturn(mockResponse);
when(mockResponse.getStatus()).thenReturn(201);
exportService.uploadDelete(p,fileName);
assertThat(ax.upload(inputStream, fileName).getStatus()).isEqualTo(201);
f.deleteOnExit();
}
1条答案
按热度按时间dpiehjr41#
这是因为RestClientReactive生成接口的实现,在本例中称为
RpoService$$CDIWrapper
,这就是实际使用的bean。convertScopes
机制并不知道这一点--它只在存在bean类为RpoService
的托管bean或生产者方法时才起作用。这里没有这样的豆子。我建议你在Quarkus中提交一个问题。
或者,如果您对转换用于测试的作用域很满意,也许您可以首先将RestClientbean设置为
@ApplicationScoped
。