SpringBoot等のフレームワークの機能を使用すると、簡単に設定ファイルが読み込めるようになりました。
しかし、E2Eの試験をするだけのプロジェクト等では重くなりがちなフレームワークを導入したくありません。
今回の記事では、Javaのみでpropertiesファイルを読み込む方法を記載します。なお、調べれば簡単に出る内容ではありますので、新規性はありません。
環境
- Java
- 15
- Gradle
ゴール
Javaで設定ファイルのpropertiesを読み込む。ymlファイルは対象外。
方法
propertiesファイルを用意する
resources
ディレクトリの配下にpropertiesファイルを用意します。今回はcommon.properties
ファイルを用意します。
baseUrl=http://localhost:8080 username=user password=pass company=ABCDE00001
設定ファイルを読み込む
Properties
クラスを使用します。インスタンスを生成し、load
メソッドでファイルを読み込みます。ファイルを読み込んだ後は、getProperties
メソッドで値を取得することができます。
public class Config { private static final Properties properties; static { properties = new Properties(); try { properties.load(Config.class.getResourceAsStream("common.properties")); } catch (Exception e) { throw new RuntimeException( String.format("ファイルの読み込みに失敗しました。ファイル名:%s", "common.properties"), e ); } } /** * プロパティ値を取得する */ public static String getProperty(final String key) { return getProperty(key, ""); } /** * 取得できなかった時に第二パラメータを返却する */ public static String getProperty(final String key, final String defaultValue) { return properties.getProperty(key, defaultValue); } }
個人的にはClass
クラスでファイルを取得するとパスの指定が簡単になります。
File
クラスを使用する場合は文字コードの指定等もできるので、確実に文字コードを指定したい場合はFile
クラスを使用しましょう。
properties.load(Files.newBufferedReader(Path.of("src/main/resources", "common.properties"), StandardCharsets.UTF_8));
ファイルを分けている理由
ファイル名を分けている理由は、IntelliJ IDEAのGo to Declaration or Usagesの機能を効かせたいためです。resourcesまでのパスとそれ以降のパスを分けることで、それ以降のパスをクリックすると元のファイルの定義にジャンプすることができます。
Go to Declaration or Usagesの機能を有効的に使えると、テスト時のセットアップファイルやリクエストファイル等にジャンプすることができるので、便利になります。
テストクラス
getProperty
のメソッドを2つ用意したのでテストしましょう。
staticメソッドなので、Config
から直接呼べます。また、設定ファイルにキーが無いときは空文字を返却します。
@Test void test_01() { assertThat(Config.getProperty("baseUrl")).isEqualTo("http://localhost:8080"); } @Test void test_02() { assertThat(Config.getProperty("noKey")).isEqualTo(""); }
第二パラメータを指定した場合、設定ファイルに設定が無いと第二パラメータを返却します。
@Test void test_03() { assertThat(Config.getProperty("noKey", "dummy")).isEqualTo("dummy"); }
ソースコード
ファイル名はこの記事とは異なりますが、実施しているのは同じです。
- https://github.com/hirotoKirimaru/cucumber-sample/blob/fbc1af8f9cc40fff4e1b1f9bafd5d04432ab623a/kirimaru-e2e/src/main/resources/selenium.properties
- https://github.com/hirotoKirimaru/cucumber-sample/blob/55de1f1e6304f604288c65527e756e94403c2a14/kirimaru-e2e/src/main/java/SeleniumConfig.java
- https://github.com/hirotoKirimaru/cucumber-sample/blob/93cd5511f1ff20f7663c5bb41dff16a985c7532c/kirimaru-e2e/src/test/java/SeleniumConfigTests.java
終わりに
今回は扱いやすさを考慮してstaticにしました。
しかし、SpringではDI対象としてインスタンスを生成するのに慣れているせいで、staticな状態で環境ごとに読み込むファイルを変更する方法が分かりませんでした…。起動時パラメータを元に読み込むファイルを変更したいのですが、どうすればいいんでしょうね。
それがわかったら、また別途記事にしようと思います。