3

这是我在 stackoverflow.com 上的第一个问题。

最近我一直在寻找一种方法来改变 Spring Boot (2.x) 如何命名它的 bean,通过 @Component (etc) 注释创建。

我找到了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 吗?

问候。

4

1 回答 1

4

@SpringBootApplication 的属性“类”仅使用类的注释。因此构建 SpringApplication 的代码在运行测试时不起作用。

如果你想解决这个问题,你可以尝试其他方法,比如在@ComponentScan 中指定nameGenerator

@ComponentScan(nameGenerator = CustomBeanNameGenerator.class)
public class Application {

 public static void main(String[] args) {
    new SpringApplicationBuilder(Application.class)
            .run(args);
 }

}

确保您的类 CustomBeanNameGenerator 有一个空的构造函数。

ps:英语不是我的母语;请原谅打字错误。

于 2018-03-09T08:57:46.293 回答