一、背景
当我们使用Spring Boot框架进行开发时,经常会需要编写单元测试类来保证代码的正确性。在编写单元测试类时,我们经常需要继承Spring Boot提供的基类 - ApplicationTests来构建应用上下文环境,但是在某些情况下,我们可能会遇到一些错误,比如:
java.lang.IllegalArgumentException: Could not resolve placeholder 'xxx' in value "${xxx}"
这种错误通常是由于在测试类中引用了application.properties或application.yml中未定义的配置项引起的,我们需要对这一错误进行解决。
二、错误解决方案
针对上述错误,我们有以下两种解决方案:
- 注解@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
这种解决方案可以在测试类中添加@SpringBootTest注解,并指定webEnvironment属性为SpringBootTest.WebEnvironment.RANDOM_PORT,示例如下:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ApplicationTests {
@Autowired
private Environment environment;
@Test
public void test() {
String value = environment.getProperty("xxx");
assertThat(value).isEqualTo("yyy");
}
}
这样就可以在测试类中获取到application.yml或application.properties中的配置项,从而避免了引用未定义的配置项导致的错误。
- 在测试类中添加@ContextConfiguration注解解析自定义application.yaml或application.properties
这种解决方案可以在测试类中添加@ContextConfiguration注解,并指定Spring提供的PropertySourcesPlaceholderConfigurer类,示例如下:
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = Application.class, initializers = ConfigFileApplicationContextInitializer.class)
public class ApplicationTests {
@Autowired
private Environment environment;
@Test
public void test() {
String value = environment.getProperty("xxx");
assertThat(value).isEqualTo("yyy");
}
}
这样就可以在测试类中获取到自定义的application.yaml或application.properties中的配置项,从而避免了引用未定义的配置项导致的错误。
三、总结
通过上述分析,我们发现在使用Spring Boot的ApplicationTests类编写单元测试时,常常会遇到应用上下文环境配置问题。我们可以通过在测试类中添加@SpringBootTest注解或添加@ContextConfiguration注解解析自定义配置文件的方式来解决这类问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring单元测试类ApplicationTests错误的解决 - Python技术站