java - 运行 Junit 测试用例时未设置 Spring 4 application.properties @Value

标签 java spring spring-boot

我正在使用 @value("${}") 从 src/main/resources 文件夹中的 application.properties 文件读取属性。当我运行该应用程序时,这效果很好。但是,当我运行测试用例时,未设置该值。 我已经尝试过以下操作:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Application.class)
@TestPropertySource("classpath:/application.properties")

这是我的完整代码。

Application.java

@SpringBootApplication
@ComponentScan ({"acn.*"})
public class Application extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertiesResolver() {

        return new PropertySourcesPlaceholderConfigurer();
    }

}

EntApiUtil.java这是设置@value的地方

    @Component
public class  EntApiUtil implements IEntApiUtil{
    Logger log = LoggerFactory.getLogger(this.getClass());

    @Value("${entapi.url}")
    private String entApiUrl;
    private static final String STATUS_VALID = "1";
    private static final String STATUS_INVALID ="0" ;
    private static final String STATUS_ERROR ="0" ;
    private static final int TIMEOUT = 60000;
    private static final String SERVICE_NAME_ADDRESS = "AddressService";
    ..............
    ..............

    private AddressBindingStub getAddressBindingStub() throws Exception {
        AddressBindingStub binding = null;
        try {
            AddressServiceLocator addressServiceLocator = new AddressServiceLocator();
            System.out.println("Ent-API URL: " + entApiUrl);
            addressServiceLocator.setAddressPortEndpointAddress(entApiUrl + "/" + SERVICE_NAME_ADDRESS);
            binding = (AddressBindingStub) addressServiceLocator.getAddressPort();
            //Time out after a minute
            binding.setTimeout(TIMEOUT);
        } catch (javax.xml.rpc.ServiceException jre) {
            log.error("Error occurred attempting to establish address validation API.", jre);
            System.out.println(" ERROR");
        }

        return binding;
    }

测试类

    @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Application.class)
@TestPropertySource("classpath:/application.properties")
public class EntApiUtilTest {


    IEntApiUtil entApiUtil;
    Address address;
    StatusVO statusVO;

    @Before
    public void setUp(){
        entApiUtil = new EntApiUtil();
        address = new Address();
        address.setStAddress("2120 Mission Rd");
        address.setUnitNum("250");
        address.setUnitType("Suite");
        address.setCity("ESCCONDIDO");
        address.setState("CA");
        address.setZipcode("92029");
    }

    @Test
    public void validateAddress_statusVO_not_null(){
        statusVO =  entApiUtil.validateAddress(address);
        assertNotNull(statusVO);
    }

    @Test
    public void validateAddress_valid_streetName(){
        statusVO =  entApiUtil.validateAddress(address);
        System.out.println(statusVO.getValidatedAddress().getStreetName() + " =======");
        assertTrue("Valid St    reet Name", statusVO.getValidatedAddress().getStreetName().equalsIgnoreCase("Mission"));
    }
}

我收到 Nullpointer 异常,因为运行测试用例时未设置值。我已经使用了类中明显的所有可能的注释,并且还尝试将其添加到我的配置类 Application.java(也尝试将其删除)

@Bean
public static PropertySourcesPlaceholderConfigurer propertiesResolver() {

    return new PropertySourcesPlaceholderConfigurer();
}

我现在缺少什么?

最佳答案

使用SpringBoot时不需要添加PropertySourcesPlaceholderConfigurer,默认已经添加了。

为什么未设置 EntApiUtil 属性值?

你正在自己实例化 new EntApiUtil() ,所以 spring 不会知道这一点。

你需要连接这个

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Application.class)
@TestPropertySource("classpath:/application.properties")
public class EntApiUtilTest

 @Autowire
 private EntApiUtil entApiUtil

   @Test
    public void validateAddress_statusVO_not_null(){
///..address etc
        statusVO =  entApiUtil.validateAddress(address);
        assertNotNull(statusVO);
    }

}

关于java - 运行 Junit 测试用例时未设置 Spring 4 application.properties @Value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40160357/

相关文章:

java - 从 Spring boot 加载多个 Angular 项目

mysql - 批处理文件和与数据库的差异

spring-data - Spring Boot Rest 搜索 404

Java Spring 远程处理选项

java - Spring Boot 无法解析字符串中的占位符

java - 需要帮助重新构建和优化大型 solr 索引

java - 未指定模块?

java - 如何正确关闭方法内的 Scanner 类?

java - Java异常中的HTTP代码

java - Spring MVC 请求映射