为什么来自 appliction.properties 的属性在 spring 启动应用程序的 Junit 测试中不可用?
why properties from appliction.properties not available in Junit test in spring boot application?
我有一个 spring 启动应用程序。我正在编写 Junit 测试。
我正在尝试注入来自 application.properties 的值(在 src/main/resources/application.properties 中定义)和在 AppConfig (src/main/java/hello/AppConfig.java) 中配置的 Status bean。我看到 bean 是自动装配的(通过调试器它不是空的)但是没有设置值。
这里是application.properties
src/main/resources/application.properties
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);
}
}
//Status 是一个带有名称和版本字段的简单 pojo
src/test/java/hello/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。只是没有设置值。
您的测试资源目录中需要另一个 属性 文件。
/src/test/resources
这就是 junit 正在寻找的地方。
感谢您分享项目。它使它更容易使用。请查看我的拉取请求(带评论)以了解我是如何让它全部工作的。
* 更新 * 由于将一些旧 Spring 注释与新注释混合,您的注释被覆盖。感谢 spring-boot properties not @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 {
它实际上是由许多其他注释组成的。重要的是 @ContextConfiguration
。对于 @SpringApplicationConfiguration
它使用一个加载器,并且该加载器正在扫描类路径以查找适当的配置文件以及要加载的组件(其中之一是将 application.properties 读入环境)。在测试中,您使用声明覆盖该注释:
@ContextConfiguration(classes={hello.TestConfig.class,hello.AppConfig.class})
这会强制 Spring 仅加载 TestConfig 和 AppConfig 类,而不扫描任何其他配置文件。注释掉该注释和 运行 它将使测试通过并调试 init() 方法将显示注入的值。
我有一个 spring 启动应用程序。我正在编写 Junit 测试。 我正在尝试注入来自 application.properties 的值(在 src/main/resources/application.properties 中定义)和在 AppConfig (src/main/java/hello/AppConfig.java) 中配置的 Status bean。我看到 bean 是自动装配的(通过调试器它不是空的)但是没有设置值。
这里是application.properties
src/main/resources/application.properties
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);
}
}
//Status 是一个带有名称和版本字段的简单 pojo
src/test/java/hello/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。只是没有设置值。
您的测试资源目录中需要另一个 属性 文件。
/src/test/resources
这就是 junit 正在寻找的地方。
感谢您分享项目。它使它更容易使用。请查看我的拉取请求(带评论)以了解我是如何让它全部工作的。
* 更新 * 由于将一些旧 Spring 注释与新注释混合,您的注释被覆盖。感谢 spring-boot properties not @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 {
它实际上是由许多其他注释组成的。重要的是 @ContextConfiguration
。对于 @SpringApplicationConfiguration
它使用一个加载器,并且该加载器正在扫描类路径以查找适当的配置文件以及要加载的组件(其中之一是将 application.properties 读入环境)。在测试中,您使用声明覆盖该注释:
@ContextConfiguration(classes={hello.TestConfig.class,hello.AppConfig.class})
这会强制 Spring 仅加载 TestConfig 和 AppConfig 类,而不扫描任何其他配置文件。注释掉该注释和 运行 它将使测试通过并调试 init() 方法将显示注入的值。