Вы можете сохранить глобальный ConfigAccessor
и разрешить выбор средств доступа, таких как:
object ConfigAccessor {
private lazy val accessor = GetConfigAccessor()
def getConfig(name: String) = accessor.getConfig(name)
...
}
Для производственных сборок вы можете поместить логику в GetConfigAccessor
, чтобы выбрать подходящий метод доступа на основе некоторых глобальных настроек, таких какtypesafe config.
Для модульного тестирования у вас может быть другая версия GetConfigAccessor
для разных тестовых сборок, которая возвращает соответствующую реализацию теста.
Установка этого значения lazy
позволяет вам контролироватьпорядок инициализации и, если необходимо, перед созданием компонентов выполните некоторые нефункциональные изменяемые операции в коде инициализации.
Обновите следующие комментарии
Производственный код будет иметь реализацию GetConfigAccessor
примерно так:
object GetConfigAccessor {
private val useAws = System.getProperties.getProperty("accessor.aws") == "true"
def apply(): ConfigAccessor =
if (useAws) {
return new AwsConfigAccessor
} else {
return new PostgresConfigAccessor
}
}
И AwsConfigAccessor
, и PostgresConfigAccessor
будут иметь свои собственные модульные тесты, чтобы доказать, что они соответствуют правильному поведению.Соответствующий метод доступа можно выбрать во время выполнения, установив соответствующее системное свойство.
Для модульного тестирования возможна более простая реализация GetConfigAccessor
, примерно такая:
def GetConfigAccessor() = new MockConfigAccessor
Модульное тестированиевыполняется в рамках модульного тестирования, которое содержит ряд библиотек и фиктивных объектов, которые не являются частью производственного кода.Они построены отдельно и не включены в конечный продукт.Таким образом, эта версия GetConfigAccessor
будет частью этого кода модульного тестирования и не будет частью конечного продукта.
С учетом всего этого я буду использовать эту модель только для чтения статические данные конфигурации, потому что это сохраняет работоспособность кода.ConfigAccessor
- это просто удобный способ доступа к глобальным константам без их передачи в конструкторе.
Если вы также записываете данные, то это больше похоже на реальную БД, чем наконфигурации.В этом случае я бы создал собственные средства доступа для каждого компонента, которые предоставляют доступ к различным частям БД.Таким образом, становится ясно, какие части данных обновляются каждым компонентом.Эти средства доступа будут переданы компоненту и затем могут быть протестированы модульно с соответствующей имитационной реализацией как обычно.
Возможно, вам придется разделить ваши данные на static config и dynamicconfig и обрабатывать их отдельно.