5

初期化時にDBからデータをロードする保護された@PostConstructメソッドを持つ静的Spring 3.2.4 Beanがあります。

jUnit テストを作成するとき、テスト メソッドで、Bean を適切にテストするために DB にデータをセットアップしたいと考えています。ただし、テスト メソッドの前に Bean がインスタンス化されるため、メソッドが完了するまで Bean のインスタンス化を延期するよう Spring に要求する方法がわかりません。

@PostConstruct メソッドが保護されているため、リフレクションを使用しない限り、直接呼び出して Bean を再初期化することはできません。

これを行う別の方法はありますか、それともリフレクションが唯一の方法ですか? Spring には簡単にするための Util クラスがありますか、それとも標準の Java リフレクションを使用する必要がありますか?

4

1 に答える 1

2

このようなユースケースでは、いつでもプログラムでコンテキストを開始できます。この場合、コンテキストのライフサイクルを担当していることに注意してください。次の擬似コードはこれを示しています。

@Test
public void yourTest() {
    // setup your database

    ConfigurableApplicationContext context =
        new ClassPathXmlApplicationContext("/org/foo/your-context.xml");
    // Or new AnnotationConfigApplicationContext(YourConfig.class)
    try {
        YourBean bean = context.getBean("beanId");
        // Assertions
    } finally {
        context.close();
    }
}

データベースを初期化するには、おそらく Spring が必要です。たとえば、通常の Spring テスト コンテキスト サポートを使用して、データベースのセットアップに必要な Bean のみを初期化し、プログラムで別のコンテキストを開始してサービスをアサートすることができます。そのコンテキストがデータベースの初期化に使用されたいくつかのサービスを必要とする場合は、代わりに次のような子コンテキストを開始できます。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration // for instance FooTest-context.xml
public class FooTest {

    @Autowired
    private ApplicationContext mainContext;

    @Test
    public void yourTest() {
        // setup your database

        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext();
        context.setParent(mainContext);
        context.setConfigLocation("/org/foo/your-context.xml");
        context.refresh();
        try {
            YourBean bean = context.getBean("beanId");
            // Assertions
        } finally {
            context.close();
        }
    }
}

これが繰り返し使用される場合は、コンテナーを開始してコールバック インターフェイスを呼び出すテンプレート メソッドを作成できます。そうすれば、コンテキストのライフサイクル管理を一元的に共有できます。

于 2014-03-13T10:31:22.093 に答える