У меня есть приложение, содержащее 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 во время тестирования, убедитесь, что ваши аннотированные классы @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);
}
}