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

Posted

技术标签:

【中文标题】如何在使用 @RunWith 和 @ContextConfiguration 注释的 jUnit 测试中访问 Spring 上下文?【英文标题】:How to access Spring context in jUnit tests annotated with @RunWith and @ContextConfiguration? 【发布时间】: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 也是可能的,答案都忽略了。我需要再谷歌一下。 【参考方案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 上工作正常

以上是关于如何在使用 @RunWith 和 @ContextConfiguration 注释的 jUnit 测试中访问 Spring 上下文?的主要内容,如果未能解决你的问题,请参考以下文章

使用 TestNG 进行 Spring 依赖注入

java测试类

使用fastDFS上传和下载图片文件

何时使用 @RunWith 以及何时使用 @ExtendWith

如何自动装配服务,进而在 Junit 中自动装配另一个服务

JDK8日期时间库 例子