Introduction
Sometimes your code should work in many environments using varaibles defined in many places. There could be default variable in code (when configuration is not defined), variable in configuration file or pom.xml for tests and maybe each developer should have own variable value...
Property reader code
All examples will be tests and will be use PropertyReader class which is defined below.
package com.blogspot.przybyszd.sandbox.propertyplaceholders; import java.util.Properties; public class PropertyReader{ public static Properties readProperties(final String configurationFile){ Properties properties = new Properties(); try{ properties.load(PropertyReader.class.getResourceAsStream(configurationFile)); }catch(Exception e){ System.err.println("Configuration file was not found"); } return properties; } }All properties files will be defined in src/test/resources.
Default properties in code
First, assume that properties file is not provided or property is not given:
package com.blogspot.przybyszd.sandbox.propertyplaceholders; import static org.junit.Assert.assertEquals; import java.util.Properties; import org.junit.Test; public class PropertyReaderTest{ @Test public void shouldUseDefaultPropertyFromCode(){ // given Properties properties = PropertyReader.readProperties("/no-existing-file.properties"); // when String value = properties.getProperty("address", "localhost"); // then assertEquals("localhost", value); } }But when property file exists and has this property then it will be used:
@Test public void shouldUsePropertyFromFile(){ // given Properties properties = PropertyReader.readProperties("/existing-file.properties"); // when String value = properties.getProperty("address", "localhost"); // then assertEquals("10.10.10.10", value); }Property in file existing-file.properties:
address=10.10.10.10
Default properties in pom.xml
Properties could be also defined in pom.xml and then placeholders could be used in property file. Test is going first:
@Test public void shouldUsePropertyFromPom(){ // given Properties properties = PropertyReader.readProperties("/file-with-placeholder.properties"); // when String value = properties.getProperty("address", "localhost"); // then assertEquals("trololo.com", value); }Instead of value in properties file there is only placeholder (file file-with-placeholder.properties):
address=${address}
Value of property is defined in pom.xml (filtering of test resources must be set to true and, optionally, resource filtering could be set to true):
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>property-placeholders</groupId> <artifactId>property-placeholders</artifactId> <version>0.0.1-SNAPSHOT</version> <name>PropertyPlaceholder</name> <properties> <address>google.com</address> </properties> <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <testResources> <testResource> <directory>src/test/resources</directory> <filtering>true</filtering> </testResource> </testResources> </build> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> </project>Now variable could be also set from command line:
mvn -Daddress=my-address clean test
Default property in settings.xml
Each developer (or each environment) could define some properties in settings.xml in $HOME/.m2 directory and these properties overwrite properties defined in pom.xml.
Test first:
Test first:
@Test public void shouldUsePropertyFromSettingsXMl(){ // given Properties properties = PropertyReader.readProperties("/file-with-placeholder.properties"); // when String value = properties.getProperty("address2", "localhost"); // then assertEquals("yahoo.com", value); }
I add new property address2 so I have to add property placeholder in properties file and in pom.xml.
Properties file:address=${address} address2=${address2}
pom.xml:
<properties> <address>google.com</address> <address2>bing.com</address2> </properties>And now variable address2 will be redefined in settings.xml file :
<settings> <profiles> <profile> <id>property-placeholder</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <address2>yahoo.com</address2> </properties> </profile> </profiles> </settings>This profile is active by default so there is not need to use -P parameter.
Not the tests pass.
No comments:
Post a Comment