Как получить доступ к контексту Spring в тестах jUnit с аннотациями @RunWith и @ContextConfiguration? - PullRequest
53 голосов
/ 11 марта 2010

У меня следующий тестовый класс

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/services-test-config.xml"})
public class MySericeTest {

  @Autowired
  MyService service;
...

}

Можно ли получить программный доступ к services-test-config.xml одним из таких способов? Как:

ApplicationContext ctx = somehowGetContext();

Ответы [ 4 ]

70 голосов
/ 11 марта 2010

Это тоже отлично работает:

@Autowired
ApplicationContext context;
45 голосов
/ 11 марта 2010

Поскольку тесты будут создаваться так же, как и bean-компонент Spring, вам просто нужно реализовать интерфейс ApplicationContextAware:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/services-test-config.xml"})
public class MySericeTest implements ApplicationContextAware
{

  @Autowired
  MyService service;
...
    @Override
    public void setApplicationContext(ApplicationContext context)
            throws BeansException
    {
        // Do something with the context here
    }
}
6 голосов
/ 11 марта 2010

Если ваш тестовый класс расширяет классы Spring JUnit
(например, AbstractTransactionalJUnit4SpringContextTests или любой другой класс, который расширяет AbstractSpringContextTests), вы можете получить доступ к контексту приложения, вызвав метод getContext().
Проверьте javadocs для пакета org.springframework.test.

0 голосов
/ 31 декабря 2018

Можно внедрить экземпляр класса ApplicationContext, используя SpringClassRule и SpringMethodRule правила. Это может быть очень удобно, если вы хотите использовать еще не весенние бегуны. Вот пример:

@ContextConfiguration(classes = BeanConfiguration.class)
public static class SpringRuleUsage {

    @ClassRule
    public static final SpringClassRule springClassRule = new SpringClassRule();

    @Rule
    public final SpringMethodRule springMethodRule = new SpringMethodRule();

    @Autowired
    private ApplicationContext context;

    @Test
    public void shouldInjectContext() {
    }
}
...