我有一个 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方法中设置了调试器,发现没有注入设置了正确值的 appName
和 status
bean . 但是注入了状态bean . 只是没有设置值 .
2 回答
感谢您分享该项目 . 这使得它更容易使用 . 请参阅我的拉动请求(带注释)以了解我是如何完成所有工作的 .
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
. 对于@SpringApplicationConfiguration
,它使用一个加载器,该加载器正在扫描类路径以获取适当的配置文件以及要加载的组件(一个是将application.properties读入环境的东西) . 在测试中,您使用声明覆盖该注释:这会强制Spring仅加载TestConfig和AppConfig类,而不扫描任何其他配置文件 . 注释掉注释并运行它将使测试通过并调试init()方法将显示注入的值 .
您需要在测试下的资源目录中使用另一个属性文件 .
这就是junit正在寻找的地方 .