如何使用 Quarkus/RestAssured 仅为一个测试用例注入模拟

cst*_*dev 5 java unit-testing quarkus

我正在尝试使用放心测试 REST 控制器(使用 Quarkus)端点。我想模拟一个注入到该控制器中的类(最好使用 Mockio),但仅限于我的一个测试。或者让每个测试用例获得不同的行为,而不必为每个测试使用单独的类。我不知道该怎么做?

我从文档中看到了这样做的方式:

@Mock
@ApplicationScoped 
public class MockExternalService extends ExternalService {

    @Override
    public String service() {
        return "mock";
    }
}
Run Code Online (Sandbox Code Playgroud)

但这只允许我对所有测试使用一个模拟,而不是像使用 Mockito 那样根据测试模拟某些行为。我认为?

我尝试创建一个模拟并用 @Mock 对其进行注释

    @Mock
    public TableExtractorService tableExtractorServiceMock = Mockito.mock(TableExtractorService.class);;
Run Code Online (Sandbox Code Playgroud)

但当我使用它时,我仍然得到了真正的实现。我在控制器中使用带有 @Inject 注释的构造函数,该构造函数采用 TableExtractorService。

有关更多信息,我使用 resassured 进行的测试如下所示:

InputPart filePart = Mockito.mock(InputPart.class);
Mockito.when(tableExtractorServiceMock.Extract(anyObject()))
       .thenThrow(IOException.class);
        
final InputStream inputStream = filePart.getBody(InputStream.class, null);

given()
                .multiPart("file", inputStream)
                .when().post("/document")
                .then()
                .statusCode(500);
Run Code Online (Sandbox Code Playgroud)

该端点调用我尝试模拟的服务类,并且我希望该模拟返回异常。

小智 1

根据Quarkus 测试文档,您可以使用@QuarkusMock@InjectMock来完成此操作。