如何在使用 @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 上下文?的主要内容,如果未能解决你的问题,请参考以下文章