2

I have a maven module with one test class DbTest. When running the test, the property file application.properties is not picked up. The line System.out.println in DvsTestDbConfig displays {database.test} instead of qqqqqqqqq (dummy value for the moment). Any idea why spring doesn't find the property file ?

Projectstructure

DbTest

package ch.admin.estv.dvs.test.database;

import ch.admin.estv.dvs.test.database.config.DvsTestDbConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@Import(DvsTestDbConfig.class)
public class DbTest {

    @Test
    public void givenPartnerToDelete_whenPartnerDelete_thenNoEntryExist() {

        System.out.println("test started");
    }
}   

DvsTestDbConfig

package ch.admin.estv.dvs.test.database.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import java.util.Properties;

@Configuration
@ComponentScan(basePackages = {"ch.admin.estv.dvs.test.database"})
@EnableTransactionManagement
public class DvsTestDbConfig {


    @Value("${database.test}")
    String databaseTest;

    @Autowired
    private Environment environment;

    @Value("${database.driverClassName}")
    String driverClassName;

    @Value("${database.url}")
    String databaseUrl;

    @Value("${database.username}")
    String databaseUsername;

    @Value("${database.password}")
    String databasePassword;


    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource());
        em.setPackagesToScan(new String[]{"ch.admin.estv.dvs.test.database"});
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        em.setJpaProperties(additionalProperties());

        return em;
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        System.out.println("**************  db property databaseTest : " + databaseTest);

        dataSource.setUrl(databaseUrl);
        dataSource.setUsername(databaseUsername);
        dataSource.setPassword(databasePassword);
        dataSource.setDriverClassName("oracle.jdbc.OracleDriver");


        return dataSource;
    }

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);

        return transactionManager;
    }

    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
        return new PersistenceExceptionTranslationPostProcessor();
    }

    Properties additionalProperties() {
        Properties properties = new Properties();
        //properties.setProperty("hibernate.hbm2ddl.auto", "validate");
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");

        properties.setProperty("hibernate.temp.use_jdbc_metadata_defaults", "false");
        properties.setProperty("hibernate.jdbc.lob.non_contextual_creation", "true");

        properties.setProperty("show_sql", "true");
        return properties;
    }

}

application.properties

database.test=qqqqqqqqq

database.url=xxxxxxxxxxxxxxxxx
database.username=xxxxxxxxxx
database.password=xxxxxxxxxxx
database.driverClassName=oracle.jdbc.OracleDriver

pom.xml

<parent>
    <artifactId>dvs-test</artifactId>
    <groupId>ch.admin.estv.dvs</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>

<modelVersion>4.0.0</modelVersion>

<artifactId>dvs-test-database</artifactId>
<packaging>jar</packaging>


<dependencies>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-oxm</artifactId>
    </dependency>

    <dependency>
        <groupId>javax.transaction</groupId>
        <artifactId>javax.transaction-api</artifactId>
    </dependency>

    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>${ojdbc6.version}</version>
    </dependency>

</dependencies>

Michael Petch
  • 46,082
  • 8
  • 107
  • 198
user2023141
  • 895
  • 5
  • 17
  • 36

2 Answers2

2

Add

@PropertySource(value = "classpath:application.properties") 

annotation on your DvsTestDbConfig class

Properties resolved through the Environment reside in one or more "property source" objects, and @Configuration classes may contribute property sources to the Environment object using the @PropertySource annotation:

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html

Anant Goswami
  • 318
  • 3
  • 14
  • I aded @PropertySource(value = "classpath:application.properties") onto DvsTestDbConfig , but still no properties found – user2023141 Jun 28 '19 at 08:31
  • Spring test has separate properties for the test. So If you are running test cases then place your properties file under src/test/resources. – Anant Goswami Jun 28 '19 at 08:52
  • I've copied application.properties into the directory src/test/resources (manually created), but still the same problem – user2023141 Jun 28 '19 at 14:46
0

Annotate your test class with @SpringBootTest . More details and alternatives: Populating Spring @Value during Unit Test

klorand
  • 151
  • 1
  • 2
  • I added the following annotatons on the test class: SpringBootTest and SpringBootConfiguration. The properties are still not found. – user2023141 Jun 28 '19 at 08:11