如何在使用@RunWith和@ContextConfiguration注释的jUnit测试中访问Spring上下文?

时间:2010-03-11 12:58:08

标签: spring junit spring-test applicationcontext

我有以下测试类

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

  @Autowired
  MyService service;
...

}

是否可以通过其中一种方法以编程方式访问services-test-config.xml?像:

ApplicationContext ctx = somehowGetContext();

4 个答案:

答案 0 :(得分:68)

这也很好用:

@Autowired
ApplicationContext context;

答案 1 :(得分:45)

由于测试将像Spring bean一样实例化,您只需要实现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
    }
}

答案 2 :(得分:6)

如果您的测试类扩展了Spring JUnit类 (例如,AbstractTransactionalJUnit4SpringContextTests或任何其他扩展AbstractSpringContextTests的类),您可以通过调用getContext()方法访问应用上下文。
查看org.springframework.test包的javadocs

答案 3 :(得分:0)

使用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() {
    }
}