Служба GraphQL не зарегистрирована при запуске теста с помощью Spring Boot

У меня есть приложение, содержащее Camel (3.14) и GraphQL (стартер, 0.0.6). Приложение создано на основе Spring Boot (2.7.5).

Приложение работает нормально, но при запуске теста происходит следующее:

@CamelSpringBootTest
@EnableAutoConfiguration
@SpringBootTest(
        properties = { "camel.springboot.name=camelTest" }
)
public class TestMailRoute
{
    @Autowired
    ProducerTemplate producerTemplate;

@EndpointInject("mock:test")
MockEndpoint mockEndpoint;

@Configuration
static class TestConfig {

    @Bean
    RoutesBuilder route() {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("direct:feedback").to("mock:test");
                from("direct:users").to("mock:test");
                from("direct:mail").to("mock:test");
            }
        };
    }
}

@Test
public void shouldAutowireProducerTemplate() {
    assertNotNull(producerTemplate);
}
...
}

У меня ошибка:

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [graphql.schema.GraphQLSchema]: Factory method 'graphQLSchema' threw exception; nested exception is java.lang.IllegalStateException: At least one top-level operation source must be registered
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653)
    ... 104 more
Caused by: java.lang.IllegalStateException: At least one top-level operation source must be registered
    at io.leangen.graphql.GraphQLSchemaGenerator.init(GraphQLSchemaGenerator.java:863)
    at io.leangen.graphql.GraphQLSchemaGenerator.generateExecutable(GraphQLSchemaGenerator.java:999)
    at io.leangen.graphql.GraphQLSchemaGenerator.generate(GraphQLSchemaGenerator.java:995)
    at io.leangen.graphql.spqr.spring.autoconfigure.BaseAutoConfiguration.graphQLSchema(BaseAutoConfiguration.java:269)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
    ... 105 more

После поиска в Google и отладки я обнаружил, что мой класс, помеченный @GraphQLApi, не инициируется, что, вероятно, вызывает исключение (напротив, оно инициируется при запуске самого приложения).

Итак, мне не хватает какой-то конфигурации или я как-то неправильно настроил свой тест, но понятия не имею, как это исправить, чтобы мой тест работал. Я пробовал использовать @ContextConfiguration (и предоставил свой класс @GraphQLApi), но возникла другая ошибка.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы решить проблему отсутствия сервисов GraphQL во время тестирования, убедитесь, что ваши аннотированные классы @GraphQLApi включены в контекст теста. Настройте свой тестовый класс следующим образом:

@CamelSpringBootTest
@SpringBootTest(properties = { "camel.springboot.name=camelTest" })
@EnableAutoConfiguration
@ComponentScan(basePackages = "com.yourpackage.graphql") // Adjust the package
public class TestMailRoute {

    @Autowired
    ProducerTemplate producerTemplate;

    @EndpointInject("mock:test")
    MockEndpoint mockEndpoint;

    @Configuration
    static class TestConfig {

        @Bean
        RoutesBuilder route() {
            return new RouteBuilder() {
                @Override
                public void configure() {
                    from("direct:feedback").to("mock:test");
                    from("direct:users").to("mock:test");
                    from("direct:mail").to("mock:test");
                }
            };
        }
    }

    @Test
    public void shouldAutowireProducerTemplate() {
        assertNotNull(producerTemplate);
    }
}

Другие вопросы по теме