Как сделать автотесты гибкими и легко конфигурируемыми без внесения правок в код? Правильно, через properties. Owner - на мой взгляд, лучшая библиотека для работы с ними.
Зачем
В документации к библиотеке очень локанично и точно это сказано. Привожу цитату без изменений:
The reason why OWNER was written is because the code dealing with the configuration is frequently repetitive, redundant, it’s made of boring and ugly static classes, singletons, long list of methods just doing conversion from a string property to a named method returning a Java primitive or a basic Java object.
Плюсы
- Open source и хорошая документация
- Простота в использовании. Например для property файла:
port=80
hostname=foobar.com
maxThreads=100
Объявляем интрефейс:
import org.aeonbits.owner.Config;
public interface ServerConfig extends Config {
int port();
String hostname();
@DefaultValue("42")
int maxThreads();
}
Получаем конфиг:
ServerConfig cfg = ConfigFactory.create(ServerConfig.class);
А также
- Не тянет лишних зависимостей
- Декларативное описание через аннотации
- Совместим с Java Properties
- Есть точки расширения
- Огромное количество возможностей:
- Стратегии загрузки пропертей. Можно задавать несколько источников properties и политику загрузки.
- Импорт properties. Можно програмно задавать property через фабрику.
- Возможность параметризации property.
- Автоматическое преобразование типов: как для примитивных типов, так и для массивов, коллекций и даже собственных классов.
- Возможность расширять значения properties из других properties
- Перезагрузка и горячая перезагрузка properties
- Возможность использования Accessible and Mutable интерфейсов для настройки доступа к properties.
- Методы для дебага
- Возможность отключать фичи
- Установка источника properties в Runtime
- Поддержка XML.
- Поддержка событий.
- Singleton
- Поддержка шифрования
Все возможности можно найти здесь.
Минусы
Не нашел.
Как попробовать
<dependency>
<groupId>org.aeonbits.owner</groupId>
<artifactId>owner</artifactId>
<version>1.0.8</version>
</dependency>
для java8:
<dependency>
<groupId>org.aeonbits.owner</groupId>
<artifactId>owner-java8</artifactId>
<version>1.0.8</version>
</dependency>