@QuarkusTest - реализация интерфейса с аннотацией @RegisterRestClient, в тесте - не проходит тест - PullRequest
1 голос
/ 28 февраля 2020

Я использую Quarkus 1.2.0.Final.

У меня есть следующий клиент REST:

@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@RegisterRestClient(configKey = "<some key>")
public interface SomeClient {

    @POST
    @Path("<some path>")
    SomeResponse someMethod(SomeRequest request);

}

Этот компонент используется в других моих компонентах как зависимость.

И у меня есть следующий тестовый пример:

@QuarkusTest
class SomeTest {
    @Test
    void testGetTransactions() { }
}

class SomeClientImpl implements SomeClient {

    @Override
    public SomeResponse someMethod(SomeRequest request) {
        // <the implementation doesn't matter>
        return null;
    }
}

Тест не пройден со следующим исключением:

Suppressed: javax.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type com.example.client.SomeClient and qualifiers [@RestClient]
...

Почему тест не пройден? Если я уберу класс class SomeClientImpl implements SomeClient {...}, тест пройден. Поэтому реализация интерфейса приводит к сбою теста, что странно.


Обновление 1:

Я попробовал следующий код и получаю то же исключение :

@QuarkusTest
class TransactionServiceImplTest {

    @Test
    void testGetTransactions() {
        new SomeClient() {

            @Override
            public SomeResponse someMethod(SomeRequest request) {
                // <the implementation doesn't matter>
                return null;
            }
        };
    }
}

1 Ответ

1 голос
/ 01 марта 2020

Клиент Quarkus REST основан на клиенте MicroProfile REST. С MP REST Client вы не должны реализовывать интерфейс REST Client - он будет автоматически сгенерирован для вас.

Например, если вы оставите интерфейс как есть:

@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@RegisterRestClient(configKey = "<some key>")
public interface SomeClient {

    @POST
    @Path("<some path>")
    SomeResponse someMethod(SomeRequest request);

}

Вы можете использовать REST-клиент в своем приложении следующим образом:

@Inject
@RestClient
SomeClient client;

public void doSomething() {
  SomeRequest req = // ...
  SomeResponse resp = someMethod(req);
}

Когда код вашего приложения вызывает someMethod(req), что происходит, если ваше приложение отправляет запрос HTTP POST на любой настроенный URL-адрес SomeClient.someMethod for, а затем ответ JSON этих HTTP-запросов POST преобразуется в объект SomeResponse с использованием JSON -B или Джексона.

Для получения дополнительной информации я бы предложил пройти через Руководство по клиенту Quarkus REST


Если ваша цель - смоделировать внешнюю службу REST, с которой обычно общается SomeClient, я бы предложил использовать библиотеку, такую ​​как MockServer , для проверки ответов на запросы вашей заявки через SomeClient. В своем тесте настройте URL-адрес для SomeClient, чтобы он указывал на MockServer, который вы запускаете как часть теста.

...