【问题标题】:How to access Spring context in jUnit tests annotated with @RunWith and @ContextConfiguration?如何在使用 @RunWith 和 @ContextConfiguration 注释的 jUnit 测试中访问 Spring 上下文?
【发布时间】:2011-01-26 08:53:04
【问题描述】:

我有以下测试类

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

  @Autowired
  MyService service;
...

}

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

ApplicationContext ctx = somehowGetContext();

【问题讨论】:

  • 我很确定即使使用香草跑步者JUnit4.class 也是可能的,答案都忽略了。我需要再谷歌一下。

标签: spring junit spring-test applicationcontext


【解决方案1】:

由于测试也将像 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
    }
}

对于非 xml 的需求,你也可以这样做:

@RunWith(SpringJUnit4ClassRunner.class)
/* must provide some "root" for the app-context, use unit-test file name to the context is empty */
@ContextConfiguration(classes = MyUnitTestClass.class)
public class MyUnitTestClass implements ApplicationContextAware {

【讨论】:

  • 到目前为止,在 Spring 3.0 及更高版本中不可能。
【解决方案2】:

可以使用SpringClassRule 注入ApplicationContext 类的实例 和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() {
    }
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 在我的 junit 测试中使用 AbstractTransactionalJUnit4SpringContextTests 或 AbstractSpringContextTests 与简单地扩展 ApplicationContextAware 有什么区别吗?此答案中建议的 2 个抽象测试类提供了哪些好处?
    【解决方案4】:

    这也很好用:

    @Autowired
    ApplicationContext context;
    

    【讨论】:

    • 已确认,在 Spring Integration 3.0.2 中。最简洁的解决方案。
    • 然而,这个解决方案只有在您将它用于托管 bean 时才可行。通过实现 ApplicationContextAware 即使在 POJO 中也能正常工作
    • 在 spring 4.2 上工作正常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    相关资源
    最近更新 更多