junit 为什么我不能为quarkus测试将singleton范围更改为applicationscoped?

qncylg1j  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(174)

我在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();

    }
dpiehjr4

dpiehjr41#

这是因为RestClientReactive生成接口的实现,在本例中称为RpoService$$CDIWrapper,这就是实际使用的bean。convertScopes机制并不知道这一点--它只在存在bean类为RpoService的托管bean或生产者方法时才起作用。这里没有这样的豆子。
我建议你在Quarkus中提交一个问题。
或者,如果您对转换用于测试的作用域很满意,也许您可以首先将RestClientbean设置为@ApplicationScoped

相关问题