【发布时间】:2022-11-22 09:19:31
【问题描述】:
我正在使用 JUnit 4(不是 5)测试 SpringBoot 休息控制器。 我正在使用 @Autowired 将控制器注入到测试中,并且它以非 null 的形式出现,因此 Spring 应用程序上下文正在交付 bean(我可以将其作为自动装配添加到测试中,并且它是非 null)。 问题是注入的 rest 控制器上的所有自动装配依赖项都是空的(还有一个 @Value 字段),即我从上下文中获取了 bean,但它还没有被自动装配。注意:我不是用 new 手动创建控制器。
这些是测试的注释:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {MyApplication.class})
@ActiveProfiles({"local", "test"})
我在构建 gradle 中使用了以下依赖项
testImplementation 'junit:junit:4.13.1'
testImplementation 'org.junit.vintage:junit-vintage-engine'
不幸的是我不能发布代码。这是一个多项目 gradle 构建,但我没有跨项目测试。该应用程序位于包含控制器的包之上的包中。
【问题讨论】:
-
什么是
MyApplication.class?通常它应该是一个 spring boot 配置文件,其中包含要加载的指定 beans 集。如果你想加载所有的 bean(包括服务、DAO 等),那么尝试不带参数运行@SpringBootTest。 -
它是 SpringBoot 应用程序类。我试过没有参数的 SpringBootTest - 没有任何区别
-
我试过向控制器类添加构造函数注入并添加断点。它在测试运行之前被调用并且依赖项被注入,但是当测试运行时它得到注入的控制器的另一个实例,一个具有空依赖项。
-
仅根据此信息很难判断会发生什么......通常注入控制器的其他 bean 是否有可能来自其他 jar 模块,因此没有被 spring boot 测试处理?
-
应用程序上的 @EnableAspectJAutoProxy 会把事情搞砸吗?
标签: java spring spring-boot junit4