为什么来自appliction.properties的属性在Spring启动应用程序中的Junit测试中不可用?

bra*_*orm 8 spring spring-test spring-boot springjunit4classrunner

我有一个春季启动应用程序.我正在写Junit测试.我试图从application.properties(在src/main/resources/application.properties中定义)和在AppConfig中配置的Status bean(src/main/java/hello/AppConfig.java)中注入值.我看到bean是自动装配的(通过调试器它不是null)但是没有设置值.

这是application.properties

src/main/resources/application.propertie s

app.name=rest-service
app.version=1.0.0-SNAPSHOT
Run Code Online (Sandbox Code Playgroud)

的src/main/JAVA /你好/ AppConfig.java

@Configuration
public class AppConfig {

    @Value("${app.version}")
    private String version;
    @Value("${app.name}")
    private String name;


    @Bean
    public Status status(){
        return new Status(name,version);
    }

}
Run Code Online (Sandbox Code Playgroud)

// Status是一个带名称和版本字段的简单pojo

SRC /测试/ JAVA /你好/ GreetingControllerTests.java

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@ContextConfiguration(classes={hello.TestConfig.class,hello.AppConfig.class})
@WebAppConfiguration
public class GreetingControllerTests {


    @Autowired
    Environment envi;

    @Autowired
    Status status;

    @Value("${app.name:notConfigured}")
    String appName;

    private String env;

    @Before
    public void init(){
        System.out.println(status.getName());
        System.out.println(appName);
        env=envi.getActiveProfiles()[0];
    }

    @Test
    public void should_fail(){
        if (env.equalsIgnoreCase("DEV")){
            assertThat(false).isFalse();
        }
        if (env.equalsIgnoreCase("QA1")){
            System.out.println("failing the test");
            fail();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我在init方法中设置了调试器,发现没有注入设置了正确值的bean appNamestatusbean.但是注入了状态bean.只是没有设置值.

Sha*_*ark 4

感谢您分享该项目。这使得工作变得更加容易。请参阅我的拉取请求(带评论)以了解我是如何使其全部正常工作的。

https://bitbucket.org/SpringDevSeattle/gs-rest-service/pull-requests/4/updating-project-for-spring-boot-14/diff

* 更新 *由于将一些旧的 Spring 注释与新的注释混合在一起,您的注释被覆盖。感谢spring-boot 属性而不是 @Autowired为我指出了基于 google 搜索的解决方案application.properties not being populated in the environment

如果你看@SpringApplicationConfiguration

@ContextConfiguration(loader = SpringApplicationContextLoader.class)
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Deprecated
public @interface SpringApplicationConfiguration {
Run Code Online (Sandbox Code Playgroud)

它实际上是由许多其他注释组成的。重要的是@ContextConfiguration. 对于它,@SpringApplicationConfiguration它使用一个加载器,并且该加载器正在扫描类路径以查找适当的配置文件以及要加载的组件(其中之一是将 application.properties 读入环境中)。在测试中,您可以使用声明覆盖该注释:

@ContextConfiguration(classes={hello.TestConfig.class,hello.AppConfig.class})
Run Code Online (Sandbox Code Playgroud)

这迫使 Spring 仅加载 TestConfig 和 AppConfig 类,而不扫描任何其他配置文件。注释掉该注释并运行它将使测试通过,并且调试 init() 方法将显示注入的值。