65

我有以下测试课

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

  @Autowired
  MyService service;
...

}

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

ApplicationContext ctx = somehowGetContext();
4

4 回答 4

85

这也很好用:

@Autowired
ApplicationContext context;
于 2010-03-11T13:31:08.707 回答
58

由于测试也将像 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 {
于 2010-03-11T13:05:04.410 回答
8

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

于 2010-03-11T13:07:53.857 回答
2

ApplicationContext可以通过使用SpringClassRuleSpringMethodRule规则注入类的实例。如果您想使用其他非 Spring 跑步者,这可能会非常方便。这是一个例子:

@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() {
    }
}
于 2018-12-31T16:02:18.733 回答