В 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”