如何使用DgsQueryExecutor测试动态生成的GraphQL Schema?
解决DGS动态Schema测试时@DgsTypeDefinitionRegistry不生效的问题
问题根源
测试环境下DGS默认优先加载schema.graphql文件,哪怕是空文件也会以此为基础构建Schema,导致你用@DgsTypeDefinitionRegistry动态注册的类型定义没被合并;同时@DgsTypeDefinitionRegistry的Bean可能没被测试上下文正确扫描初始化。
具体解决步骤
1. 确保动态Schema注册类被测试上下文扫描到
如果你的@DgsTypeDefinitionRegistry注解类不在测试类的包路径下,直接在测试类上用@Import引入:
@SpringBootTest @Import(CustomTypeDefinitionRegistry.class) // 替换成你的TypeDefinitionRegistry类 public class DataFetcherRegistryTest { // ... 原有代码 }
2. 禁用默认schema文件加载
在测试资源目录下的application.properties(或application.yml)添加配置,让DGS找不到默认的schema文件,从而触发动态注册的Schema加载:
# 指向一个不存在的文件,强制DGS使用动态注册的Schema dgs.graphql.schema-file=classpath:non-existent.graphql
或者用yml格式:
dgs: graphql: schema-file: classpath:non-existent.graphql
3. 校验动态Schema注册逻辑
确保@DgsTypeDefinitionRegistry的方法返回的TypeDefinitionRegistry正确定义了所需的类型和字段,比如:
@DgsTypeDefinitionRegistry public class CustomTypeDefinitionRegistry { public TypeDefinitionRegistry registry() { TypeDefinitionRegistry registry = new TypeDefinitionRegistry(); // 定义Query类型及catalog字段 registry.add(GraphQLObjectType.newObject() .name("Query") .field(f -> f.name("catalog").type(GraphQLTypeReference.typeRef("Catalog"))) .build()); // 定义Catalog类型及customer字段 registry.add(GraphQLObjectType.newObject() .name("Catalog") .field(f -> f.name("customer").type(GraphQLTypeReference.typeRef("Customer"))) .build()); // 定义Customer类型及test_attribute字段 registry.add(GraphQLObjectType.newObject() .name("Customer") .field(f -> f.name("test_attribute").type(Scalars.GraphQLString)) .build()); return registry; } }
4. 确认DataFetcher绑定正确
@DgsCodeRegistry的DataFetcher要和动态定义的字段完全匹配,比如:
@DgsCodeRegistry public class CustomDataFetcherRegistry { public void registerDataFetchers(DataFetcherRegistry registry) { // 绑定Query.catalog的DataFetcher registry.registerDataFetcher("Query", "catalog", environment -> { // 返回模拟的Catalog数据 Map<String, Object> customer = new HashMap<>(); customer.put("test_attribute", "test-value"); Map<String, Object> catalog = new HashMap<>(); catalog.put("customer", customer); return catalog; }); } }
做完以上步骤后,重新运行测试,应该就能正确加载动态Schema并执行查询了。
内容的提问来源于stack exchange,提问作者user3236794
相关产品推荐
相关产品推荐

