[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-test-kak-spring-keshiruet-kontekst-v-testakh-i-chto-takoe-dirtiescontext":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},693,"kak-spring-keshiruet-kontekst-v-testakh-i-chto-takoe-dirtiescontext",16,"spring-test","Spring Test","🧪","Как Spring кэширует контекст в тестах и что такое DirtiesContext?","Spring TestContext Framework кэширует `ApplicationContext` между тестами для повышения производительности. Контекст создаётся один раз и переиспользуется всеми тестами с одинаковой конфигурацией.\n\n> **Аналогия из жизни:** кэширование контекста — как общий рабочий стол в офисе. Пока настройки одинаковые, все используют один стол. Но если кто-то разлил кофе (`@DirtiesContext`), стол нужно заменить.\n\n### Ключ кэша формируется на основе\n\n- Набора конфигурационных классов \u002F XML-файлов\n- Активных профилей (`@ActiveProfiles`)\n- Свойств (`properties`)\n- Наличия `@MockBean` \u002F `@SpyBean`\n- Других параметров контекста\n\nЕсли два тестовых класса имеют одинаковый набор параметров, они разделят один и тот же контекст.\n\n### DirtiesContext\n\n`@DirtiesContext` помечает тест, после которого контекст считается «грязным» и должен быть пересоздан. Это необходимо, когда тест изменяет состояние контекста (меняет бин, модифицирует синглтон, изменяет данные в кэше).\n\n```java\n@SpringBootTest\nclass ContextCachingTest {\n\n    @Test\n    @DirtiesContext\n    void testThatModifiesContext() {\n        cacheService.clearAll();\n    }\n\n    \u002F\u002F После предыдущего теста контекст будет пересоздан\n    @Test\n    void testAfterDirtyContext() {\n        \u002F\u002F работает с чистым контекстом\n    }\n}\n```\n\n### Режимы DirtiesContext на уровне класса\n\n```java\n\u002F\u002F Пересоздавать контекст после каждого тестового метода\n@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)\n\n\u002F\u002F Пересоздать контекст после всего тестового класса\n@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)\n\n\u002F\u002F Пересоздать контекст до класса\n@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)\n```\n\n> **На собеседовании:** важно подчеркнуть, что злоупотребление `@DirtiesContext` значительно замедляет тесты, так как пересоздание контекста — дорогостоящая операция. Частая ошибка — ставить `@DirtiesContext` на каждый тест «для надёжности».","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Как Spring кэширует контекст в тестах и что такое DirtiesCon — Gymterview","Spring TestContext Framework кэширует `ApplicationContext` между тестами для повышения производительности. Контекст создаётся один раз и переиспользуется всеми ","Spring TestContext Framework кэширует `ApplicationContext` между тестами для повышения производительности. Контекст созд",[7,13],"Spring TestContext Framework кэширует `ApplicationContext` между тестами для повышения производительности. Контекст создаётся один раз и переиспользуется всеми тестами с одинаковой конфигурацией.",true]