这是我在stackoverflow.com上的第一个问题。
最近我一直在寻找一种方法来改变Spring Boot(2.x)如何通过@Component(etc)注释创建bean的名称。
我找到了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 Context - 在这种情况下,SpringApplicationBuilder不是任何使用,因此我们的应用程序启动失败,因为自动装配多bean候选问题。
@RunWith(SpringRunner.class)
@SpringBootTest(classes= {Application.class} )
public class SomeControllerTest {
...
}
是否有任何优雅的方法使单元测试也使用SpringApplicationBuilder?
问候。
答案 0 :(得分:1)
@SpringBootApplication的属性“classes”仅使用类的注释。因此,在运行测试时,构建SpringApplication的代码不起作用。
如果要解决此问题,可以尝试其他方法,例如在@ComponentScan中指定nameGenerator
@ComponentScan(nameGenerator = CustomBeanNameGenerator.class)
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class)
.run(args);
}
}
确保您的类CustomBeanNameGenerator具有空构造函数。
ps:英语不是我的母语;请原谅输入错误。