Как отключить иерархический @ContextConfiguration (контекст приложения) после запуска интеграционного теста
Цель: пометить конфигурацию контекста 2-го уровня как грязную после урока.
Ограничение: контекст 2-го уровня должен быть объединен с контекстом 1-го уровня.
Фон:
- У меня есть несколько ИТ (интеграционных тестов), в которых используется.
Я буду называть их «обычными» . - Некоторые из этих ИТ также используют другой контекст.
Я буду называть их «обычным + X» . - Некоторые из "обычных + X" ИТ требуют
common-context.xml
иX-context.xml
загружаться одновременно .
Я понимаю, что это влечет за собой плохой первоначальный дизайн, но в настоящее время я сталкиваюсь с огромной системой, в которой такой радикальный рефакторинг невозможен.
Что я пробовал:
Все возможные комбинации:
- @ContextConfiguration.
- @ContextHierarchy.
- @DirtiesContext.
- имя переменной.
- Переменная 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
с?
Что я прочитал:
- Spring TestContext Framework
- GitHub Spring
- Справочник по Spring Framework
- Перезагрузить или обновить контекст приложения Spring внутри тестового метода?
- Интеграция Spring с несколькими файлами конфигурации
- Spring - Как загрузить новый иерархический контекст?
- Сделать ApplicationContext грязным до и после тестового класса
- Spring тест @ContextConfiguration и статический контекст
- Очистить контекст приложения Spring после тестирования
- Подключение к жизненному циклу Spring Bean
- И еще несколько ...