SpringApplicationBuilder 在使用 JUnit SpringRunner 进行集成测试期间不会加载



这是我关于 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:英语不是我的母语;请原谅打错。

最新更新