web-dev-qa-db-ja.com

@RunWithおよび@ContextConfigurationアノテーションが付けられたjUnitテストでSpringコンテキストにアクセスする方法は?

次のテストクラスがあります

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

  @Autowired
  MyService service;
...

}

そのような方法のいずれかでプログラムでservices-test-config.xmlにアクセスすることは可能ですか?のような:

ApplicationContext ctx = somehowGetContext();
53
Vladimir

テストも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
    }
}
46
Daff

これもうまくいきます:

@Autowired
ApplicationContext context;
71
axtavt

テストクラスがSpring JUnitクラスを拡張する場合
(例:AbstractTransactionalJUnit4SpringContextTestsまたはAbstractSpringContextTestsを拡張する他のクラス)、getContext()メソッドを呼び出すことでアプリのコンテキストにアクセスできます。
パッケージorg.springframework.testの javadocs を確認してください。

6
duffymo

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() {
    }
}
0
Laplas