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

时间:2018-03-09 05:20:49

标签: java spring-boot junit spring-test springrunner

这是我在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?

问候。

1 个答案:

答案 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:英语不是我的母语;请原谅输入错误。