2016-03-03 5 views
0

Типичный exmaple является:Как воссоздать только выбранный весенний контекст в весенних тестах?

@ContextConfiguration(locations = { 
     "classpath:someITTest-mock.xml", 
     "classpath:someITTest-context.xml", 
     "classpath:commons.xml"}) 
@Transactional 
@RunWith(SpringJUnit4ClassRunner.class) 
public class SomeITTest { 
//... 
} 

Я найти способ воссоздать издевается во время испытаний. Очевидный способ использования DirtiesContext Но это приводит к воссозданию всех контекстов, когда нужно воссоздать только макет контекста.

Вот несколько примечаний:

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

Итак, есть способ воссоздать весенний контекст, где создаются издевательства, но оставить в другом кэшированном контексте?

ответ

0

Вы можете использовать @ContextHierarchy и @DirtiesContext:

@ContextHierarchy({ 
@ContextConfiguration(name="parent", 
    locations = {"classpath:someITTest-context.xml", "classpath:commons.xml"}), 
@ContextConfiguration(name="child", 
    locations = "classpath:someITTest-mock.xml") 
}) 
@DirtiesContext(hierarchyMode = CURRENT_LEVEL) 

С этим только ребенок контекст должен быть перезагружен, см Testing.

+0

Хотя вы правы только о контексте ребенка перезагрузке в вашем примере, это, вероятно, не решить исходную задачу. –

+0

Я предполагаю, что 'commons.xml' полагается на beans, объявленный в' someITTest-mock.xml'. Таким образом, высмеиваемые бобы, объявленные в последнем, должны быть видны бобам, объявленным первым. Если вы предложили иерархию родитель-ребенок, это было бы невозможно. Родительский контекст не может видеть компоненты, определенные в дочернем контексте. –

1

Обновление: Если вы используете Spring Boot 1.4, вы можете использовать свою первоклассную поддержку для издевательских бобов через @MockBean.

Так есть способ воссоздать весенний контекст, где создаются издевательства, но оставить в другом кэшированном контексте?

Нет, это невозможно.

В вашем примере есть только один один ApplicationContext, который загружен из всех трех файлов конфигурации XML. Если вы создаете иерархию с использованием @ContextHierarchy, будет множество контекстов; однако невозможно перезагрузить только родительский контекст (см. другие комментарии, которые я опубликовал в этом потоке).

Однако, один общий подход, который люди принимают в таких сценариях, - это явно сбрасывать рассматриваемые макеты.

Существует в основном два способа достижения этого.

  1. Если издевается впрыскивают в тесте интеграции (например, с помощью @Autowired) вы можете просто сбросить на издевается в качестве после способом (например, в методе @After в JUnit 4).
  2. В противном случае вы можете реализовать и зарегистрировать пользовательский TestExecutionListener, который извлекает издеваемую фасолью из ApplicationContext и сбрасывает их (например, в методе afterTestMethod()).

С уважением,

Сэм (автор Spring TestContext Framework)

Смежные вопросы