Spring не загружает applicationContext, когда у меня есть несколько тестов интеграции (@MockBean / @MockSpy) [duplicate]

Этот вопрос немного устарел, но я просто написал это, и я думаю, что он немного более изящный, чем другие предлагаемые решения:

/// <summary>
/// Break a list of items into chunks of a specific size
/// </summary>
public static IEnumerable<IEnumerable<T>> Chunk<T>(this IEnumerable<T> source, int chunksize)
{
    while (source.Any())
    {
        yield return source.Take(chunksize);
        source = source.Skip(chunksize);
    }
}
4
задан beginner_ 22 February 2013 в 12:07
поделиться

3 ответа

Добавить @DirtiesContext аннотацию к вашему тестовому классу:

@ContextConfiguration(...)
@RunWith(...)
@DirtiesContext // <== add e.g. on class level
public class MyTest {
    // ...
}

Эта аннотация указывает, что контекст приложения, связанный с тестом, грязный и должен быть закрыт. Последующие тесты будут снабжены новым контекстом. Работает на уровне класса и уровне метода.

5
ответ дан jeha 21 August 2018 в 01:11
поделиться
  • 1
    Проблема в том, что это происходит после того, как тест выполняется не раньше. Или сказал иначе, я должен был бы отметить каждый тестовый класс этой аннотацией, чтобы заставить ее работать. Мне нужно что-то вроде @RunInOwnContext. – beginner_ 23 February 2013 в 15:30
  • 2
  • 3
    Конечно, вы пытаетесь изменить SpringJUnit4ClassRunner / TestContextManager так, как вам нужно ... но я не знаю, действительно ли это то, что вы действительно хотите – jeha 23 February 2013 в 16:15
  • 4
    отмеченный как ответ. Кажется, нет другого способа, чем комментировать все классы Test с помощью @DirtiesContext. – beginner_ 14 March 2013 в 18:22

Я не знаю, остается ли вопрос / вопрос релевантным, но вот простое / правильное решение (не нужно добавлять @DirtiesContext во все ваши тесты). Avoid @DirtiesContext позволяет иметь только один общий контекст для всех тестов интеграции (например, через maven или запускать все тесты в среде IDE). Это позволяет избежать множества проблем, вызванных несколькими контекстами, запущенными в одно и то же время.

<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
  p:configLocation="ehcache.xml"
  p:cacheManagerName="myCacheManager"
  p:shared="${ehcacheManager.shared:true}"
  p:acceptExisting:"${ehcacheManager.acceptExisting:false}"/>

В ваших тестах (интеграционных тестах) задайте эти свойства

ehcacheManager.acceptExisting=true
ehcacheManager.shared=false

Это позволяет Spring создавать EhcacheManager (ehcache) для каждого теста, но если существует EhcacheManager с таким же именем, Spring просто повторно его использует. И Spring также не уничтожит / выключит его в контексте, аннотированном с @DirtiesContext.

Идея проста: вы предотвращаете уничтожение EhcacheManager при использовании @DirtiesContext.

Это применимо, если вы используете Spring 4 и EhCache: 2.5+. С Spring 3 вы должны расширить EhCacheManagerFactoryBean, чтобы добавить эти два свойства.

Не забудьте очистить кеш до каждого теста:)

2
ответ дан khong07 21 August 2018 в 01:11
поделиться

Вы можете запустить тесты с отключенным кэшированием, даже если ваш код имеет методы с аннотациями @Cacheable.

Таким образом, вам не нужно замедлять выполнение теста, отмечая все ваши тесты с помощью @DirtiesContext .

Поместите связанные с кешем настройки Spring в свой собственный конфигурационный файл Spring, например. Файл applicationContext-cache.xml.

Включите этот файл applicationContext-cache.xml только при запуске приложения в реальном времени, но не в ваших тестах.

Если вы специально хотите протестировать кеширование, то вам понадобится аннотация @DirtiesContext.

2
ответ дан Tero Hagström 21 August 2018 в 01:11
поделиться
  • 1
    У меня есть методы с аннотацией @Cacheable, и поэтому CacheManager должен всегда присутствовать. – beginner_ 26 June 2014 в 06:00
  • 2
    – Tero Hagström 30 June 2014 в 12:50
Другие вопросы по тегам:

Похожие вопросы: