Как я могу имитировать класс экземпляра с помощью макета в Quarkus?
Минимальный рабочий пример перед использованием экземпляра:
Изначально у меня был минимальный воспроизводимый код, работавший следующим образом:
У меня был один интерфейс, реализованный классом ServiceA:
< pre class="lang-java Prettyprint-override">
Код: Выделить всё
public interface ServiceInterface {
public String getName();
}
Код: Выделить всё
@ApplicationScoped
public class ServiceA implements ServiceInterface {
@Override
public String getName() {
return "I am A";
}
}
Код: Выделить всё
@Path("/hello")
public class GreetingResource {
@Inject
ServiceInterface service;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(service.getName());
return stringBuilder.toString();
}
}

И я мог бы написать простой тест, высмеивающий его (
Код: Выделить всё
quarkus-junit5-mockito
Код: Выделить всё
import static org.mockito.Mockito.when;
@QuarkusTest
class GreetingResourceTest {
@InjectMock
ServiceInterface service;
@Test
void testHelloEndpoint() {
when(service.getName()).thenReturn("I am C");
given()
.when().get("/hello")
.then()
.statusCode(200)
.body(is("I am C"));
}
}
Теперь я представил вторую службу:
Код: Выделить всё
@ApplicationScoped
public class ServiceB implements ServiceInterface {
@Override
public String getName() {
return "I am B";
}
}
Код: Выделить всё
@Path("/hello")
public class GreetingResource {
@Inject
Instance services;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
StringBuilder stringBuilder = new StringBuilder();
for (ServiceInterface service : services) {
stringBuilder.append(service.getName());
}
return stringBuilder.toString();
}
}
Но я не могу найти способ переписать свой тест.
Мои попытки:
Например, некоторые попытки решить эту проблему были следующими:
Код: Выделить всё
@QuarkusTest
class GreetingResourceTest {
@InjectMock
Instance services;
@Test
void testHelloEndpoint() {
// This is wrong!!!
when(services.get().getName()).thenReturn("I am C");
given()
.when().get("/hello")
.then()
.statusCode(200)
.body(is("I am C"));
}
}
Код: Выделить всё
@QuarkusTest
class GreetingResourceTest {
@Mock
Instance services;
@InjectMock
ServiceInterface service;
@Test
void testHelloEndpoint() {
// This is wrong!!
when(services.get()).thenReturn(service);
when(services.get().getName()).thenReturn("I am C");
given()
.when().get("/hello")
.then()
.statusCode(200)
.body(is("I am C"));
}
}
Поле jakarta.enterprise.inject .Instance org.acme.GreetingResourceTest.services класса org.acme.GreetingResourceTest не является полем производителя, но помечается стереотипом: io.quarkus.test.Mock
Подробнее здесь: https://stackoverflow.com/questions/783 ... -type-in-q