В Java properties – это значения конфигурации, которые представлены в виде пар ключ-значение, обычно управляемых внутри объекта Properties |/.
Системные свойства в основном являются Свойства объект класса
System , который "описывает конфигурацию текущей рабочей среды". Это включает в себя информацию о текущем пользователе, операционной системе или среде выполнения Java. Класс
System предлагает различные методы для взаимодействия со своими свойствами, однако наиболее часто используемыми являются:
clearProperty(Строковый ключ)
: Удаляет системное свойство, указанное указанным ключом.getProperty(Строковый ключ)
: Возвращает системное свойство, указанное указанным ключом.setProperty(Строковый ключ, Строковое значение)
: Задает системное свойство, указанное указанным ключом.
Иногда вам нужно управлять свойствами системы, когда вы тестируете код, который каким-то образом использует Система
. При этом вы не должны просто дико изменять их значения, иначе тесты могут непреднамеренно зависеть от возможных побочных эффектов. Затем изменения в вашем тестовом коде или даже изменение порядка выполнения могут привести к сбоям тестирования, которые трудно отладить. Поэтому вы хотите иметь надлежащий механизм восстановления, который очищает среду после каждого теста.
Когда дело доходит до JUnit 4 , для этого уже существуют готовые библиотеки, такие как фантастический проект System Rules . Но для JUnit 5 вам пришлось придумать собственное решение — по крайней мере, до сих пор.
Существует JUnit Pioneer , полуофициальный пакет расширений для JUnit 5. Он предлагает различные аккуратные расширения, а начиная с версии 0.5.0 также механизм для безопасной обработки системных свойств. Свойство @ClearSystemProperty
и @SetSystemProperty
аннотация соответственно, могут использоваться для очистки и установки значений системных свойств для выполнения теста. Обе аннотации работают на уровне метода тестирования и класса, являются повторяемыми, а также комбинируемыми. После выполнения аннотированного метода свойства, упомянутые в аннотации, будут восстановлены до их первоначального значения или будут очищены, если у них его раньше не было. Другие системные свойства, измененные во время тестирования, не восстанавливаются.
Например, очистка системного свойства для выполнения теста может быть выполнена следующим образом:
@Test @ClearSystemProperty(key = "some property") void test() { assertNull(System.getProperty("some property")); }
И установка системного свойства для выполнения теста:
@Test @SetSystemProperty(key = "some property", value = "new value") void test() { assertEquals("new value", System.getProperty("some property")); }
Как упоминалось ранее, обе аннотации повторяемы, и их также можно комбинировать:
@Test @ClearSystemProperty(key = "1st property") @ClearSystemProperty(key = "2nd property") @SetSystemProperty(key = "3rd property", value = "new value") void test() { assertNull(System.getProperty("1st property")); assertNull(System.getProperty("2nd property")); assertEquals("new value", System.getProperty("3rd property")); }
Обратите внимание, что конфигурации уровня класса перезаписываются конфигурациями уровня метода:
@ClearSystemProperty(key = "some property") class MySystemPropertyTest { @Test @SetSystemProperty(key = "some property", value = "new value") void test() { assertEquals("new value", System.getProperty("some property")); } }
Иногда вам также может потребоваться присвоить системному свойству значение, которое не является постоянным выражением, что требуется для значений аннотаций. В этом случае вы все равно можете использовать механизм восстановления:
@ParameterizedTest @ValueSource(strings = { "foo", "bar" }) @ClearSystemProperty(key = "some property") void test(String value) { System.setProperty("some property", value); }
Как вы можете видеть, обе аннотации довольно эффективны и применимы во многих ситуациях. Итак, станьте пионером JUnit stargazer на GitHub и верните себе контроль над свойствами вашей системы!
Оригинал: “https://dev.to/beatngu1101/handling-system-properties-in-junit-5-4iom”