Spring Boot GraphQL测试无法自动装配GraphQlTester问题求助
核心问题由依赖版本冲突和测试注解缺少自动配置开关两个原因导致,按以下步骤修复即可:
1. 修正依赖配置,消除版本冲突
手动指定spring-graphql-test:1.0.0的写法,会覆盖Spring Boot 2.7.2-SNAPSHOT内置BOM统一管控的依赖版本,版本不匹配会直接导致GraphQlTester的自动配置类不生效。
同时引入全量spring-webflux的方式容易和当前使用的Servlet栈(spring-boot-starter-web)产生配置冲突,测试场景只需要引入webflux的测试启动器即可。修正后的依赖配置如下:
dependencies { implementation 'org.springframework.boot:spring-boot-starter-graphql:2.7.2-SNAPSHOT' implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test:2.7.2-SNAPSHOT' // 移除手动指定的版本号,由Spring Boot BOM统一管理版本 testImplementation 'org.springframework.graphql:spring-graphql-test' // 替换全量spring-webflux为WebFlux测试启动器,避免栈冲突 testImplementation 'org.springframework.boot:spring-boot-starter-webflux' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' }
调整后执行./gradlew clean build刷新依赖,清除本地缓存的旧版本依赖包。
2. 按测试场景调整注解配置
切片测试场景(@GraphQlTest)
@GraphQlTest是GraphQL专属的切片测试注解,只会加载GraphQL层相关Bean,依赖修正后不需要额外添加其他注解即可直接注入GraphQlTester,可参考如下测试代码:
import com.example.demo.dao.ProfileDao; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.graphql.GraphQlTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.graphql.test.tester.GraphQlTester; import static org.junit.jupiter.api.Assertions.assertNotNull; @GraphQlTest class DemoApplicationTests { @Autowired private GraphQlTester graphQlTester; @MockBean private ProfileDao dao; @Test void contextLoads() { assertNotNull(graphQlTester); } }
注:原代码使用的org.springframework.test.util.AssertionErrors是Spring内部工具类,参数顺序容易写错,推荐直接使用JUnit5自带的断言方法。
全上下文测试场景(@SpringBootTest)
@SpringBootTest默认不会开启GraphQlTester的自动配置,必须额外添加@AutoConfigureGraphQlTester注解才会自动注入实例,参考代码如下:
import com.example.demo.dao.ProfileDao; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.autoconfigure.graphql.tester.AutoConfigureGraphQlTester; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.graphql.test.tester.GraphQlTester; import static org.junit.jupiter.api.Assertions.assertNotNull; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @AutoConfigureGraphQlTester // 必须添加该注解开启GraphQlTester自动配置 class DemoApplicationTests { @Autowired private GraphQlTester graphQlTester; @MockBean private ProfileDao dao; @Test void contextLoads() { assertNotNull(graphQlTester); } }
额外排查点
如果上述调整后仍注入失败,执行./gradlew dependencies查看依赖树,排查是否有其他第三方依赖引入了不同版本的spring-graphql相关包,手动排除冲突版本即可。
内容的提问来源于stack exchange,提问作者Miklosh

