这是我关于 stackoverflow.com 的第一个问题。
最近我一直在寻找一种方法来更改 Spring Boot (2.x( 命名其 bean 的方式,通过@Component(等(注释创建。
我找到了 SpringApplicationBuilder 类,谢天谢地,它允许注入自定义 Bean 名称生成器:
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class)
.beanNameGenerator(customBeanNameGenerator)
.run(args);
}
}
但问题是,尽管这个解决方案适用于生产环境,但这在 JUnit 4.0 单元测试中不起作用,其中 JUnit Runner SpringRunner 重新创建 Spring 上下文以进行测试 - 在这种情况下,SpringApplicationBuilder 不会被使用,结果我们的应用程序启动失败,导致自动连线多 bean 候选问题。
@RunWith(SpringRunner.class)
@SpringBootTest(classes= {Application.class} )
public class SomeControllerTest {
...
}
有没有优雅的方法可以让单元测试也使用SpringApplicationBuilder?
问候。
@SpringBootApplication的属性 "classes" 仅使用类的注释。 因此,在运行测试时,用于构建 SpringApplication 的代码不起作用。
如果要解决此问题,可以尝试其他方法,例如在@ComponentScan中指定名称生成器
@ComponentScan(nameGenerator = CustomBeanNameGenerator.class)
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class)
.run(args);
}
}
确保类 CustomBeanNameGenerator 具有空构造函数。
PS:英语不是我的母语;请原谅打错。