Как отключить иерархический @ContextConfiguration (контекст приложения) после запуска интеграционного теста

Цель: пометить конфигурацию контекста 2-го уровня как грязную после урока.

Ограничение: контекст 2-го уровня должен быть объединен с контекстом 1-го уровня.


Фон:

  • У меня есть несколько ИТ (интеграционных тестов), в которых используется.
    Я буду называть их «обычными» .
  • Некоторые из этих ИТ также используют другой контекст.
    Я буду называть их «обычным + X» .
  • Некоторые из "обычных + X" ИТ требуют common-context.xml иX-context.xmlзагружаться одновременно .
    Я понимаю, что это влечет за собой плохой первоначальный дизайн, но в настоящее время я сталкиваюсь с огромной системой, в которой такой радикальный рефакторинг невозможен.

Что я пробовал:

Все возможные комбинации:

  1. @ContextConfiguration.
  2. @ContextHierarchy.
  3. @DirtiesContext.
  4. имя переменной.
  5. Переменная inheritLocations .

Образец:

      @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations =  "classpath:/META-INF/common-context.xml" )
public abstract class AbstractIntegrationTest extends AbstractJUnit4SpringContextTests {

}

public class IT1 extends AbstractIntegrationTest {
    // Some tests...
}

@ContextHierarchy(  @ContextConfiguration(locations = "X-context.xml")  )
@DirtiesContext(classMode = ClassMode.AFTER_CLASS, hierarchyMode = HierarchyMode.CURRENT_LEVEL)
public class IT2 extends AbstractIntegrationTest {
    // Some tests...
}

public class IT3 extends AbstractIntegrationTest {
    // Some tests...
}

Ожидаемое поведение:

Теперь, если тесты выполняются в таком порядке (IT1 -> IT2 -> IT3):

      common-context.xml is up.
IT1 runs.

X-context.xml is up.
IT2 runs using common-context and X-context.
X-context.xml is down.

IT3 runs.
common-context.xml is down.

Это прекрасно работает до тех пор, пока «X-context» не нужно загружать вместе с «common-context».

Основная проблема:

Чтобы загрузить вместе контексты "common" и "X", их необходимо объединить.
В противном случае загружается «common», затем загружается «X». Некоторые тесты полагаются на одновременную загрузку обоих контекстов.

Их объединение отключает возможность пометить только контекст 2-го уровня как грязный.


Чтобы объединить их, мы реорганизуем:

      @RunWith(SpringJUnit4ClassRunner.class)
@ContextHierarchy(  @ContextConfiguration(name="common", locations="classpath:/META-INF/common-context.xml")  )
public abstract class AbstractIntegrationTest extends AbstractJUnit4SpringContextTests {

}

public class IT1 extends AbstractIntegrationTest {
    // Some tests...
}

@ContextHierarchy(  @ContextConfiguration(name="common", locations="X-context.xml", inheritLocations=false)  )
@DirtiesContext(classMode = ClassMode.AFTER_CLASS, hierarchyMode = HierarchyMode.CURRENT_LEVEL)
public class IT2 extends AbstractIntegrationTest {
    // Some tests...
}

public class IT3 extends AbstractIntegrationTest {
    // Some tests...
}

Фактическое поведение:

Теперь, если тесты выполняются в таком порядке (IT1 -> IT2 -> IT3):

      common-context.xml is up.
IT1 runs.

common-context.xml + X-context.xml is up.
IT2 runs.
common-context.xml + X-context.xml is down.

IT3 runs.
common-context.xml is down.

Таким образом, мы не использовали первый общий контекст, который был запущен.


Возможные решения:

Некоторые идеи, которые, как мне кажется, могут решить проблему, но я не знаю, как их реализовать:

  • Каким-то образом "развяжите" MergedContextConfiguration после ИТ.
  • Реализовать TestContextManager , который может держать 2 различных сек в кэше.
  • Используйте SmartContextLoader для включения необходимых функций.
  • Используйте TestExecutionListener, чтобы включить необходимую функциональность.
  • Другой подход, который не объединяет 2 ApplicationContextс?

Что я прочитал:

0 ответов

Другие вопросы по тегам