Рубрики
Без рубрики

Обработка системных свойств в JUnit 5

В Java свойства – это значения конфигурации, которые представлены в виде пар ключ-значение, обычно управляемых… Помечен как java, junit, junit 5, тестирование.

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