Как я могу имитировать класс «Instance» для тестирования нескольких сервисов одного типа в Quarkus?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу имитировать класс «Instance» для тестирования нескольких сервисов одного типа в Quarkus?

Сообщение Anonymous »

Вопрос:
Как я могу имитировать класс экземпляра с помощью макета в 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
добавлен в pom.xml):

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»