首页 文章

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

提问于
浏览
7

我有一个 Spring 季启动应用程序 . 我正在写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

src/main/java/hello/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);
    }

}

//状态是一个带名称和版本字段的简单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();
        }
    }
}

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

2 回答

  • 4

    感谢您分享该项目 . 这使得它更容易使用 . 请参阅我的拉动请求(带注释)以了解我是如何完成所有工作的 .

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

    *** Update *** 由于将一些旧的Spring注释与较新的注释混合,您的注释被覆盖了 . 致spring-boot properties not @Autowired的信用指示我基于谷歌搜索 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 {
    

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

    @ContextConfiguration(classes={hello.TestConfig.class,hello.AppConfig.class})
    

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

  • 0

    您需要在测试下的资源目录中使用另一个属性文件 .

    /src/test/resources
    

    这就是junit正在寻找的地方 .

相关问题