15

TestExecutionListenerカスタムを と組み合わせて使用SpringJUnit4ClassRunner​​して、テスト データベースで Liquibase スキーマのセットアップを実行したいと考えています。私TestExecutionListenerは正常に動作しますが、クラスでアノテーションを使用すると、テスト対象の DAO の注入が機能しなくなり、少なくともインスタンスは null になります。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/applicationContext-test.xml" })
@TestExecutionListeners({ LiquibaseTestExecutionListener.class })
@LiquibaseChangeSet(changeSetLocations={"liquibase/v001/createTables.xml"})
public class DeviceDAOTest {

    ...

    @Inject
    DeviceDAO deviceDAO;

    @Test
    public void findByCategory_categoryHasSubCategories_returnsAllDescendantsDevices() {
        List<Device> devices = deviceDAO.findByCategory(1); // deviceDAO null -> NPE
        ...
    }
}

リスナーはかなり単純です。

public class LiquibaseTestExecutionListener extends AbstractTestExecutionListener {

    @Override
    public void beforeTestClass(TestContext testContext) throws Exception {
        final LiquibaseChangeSet annotation = AnnotationUtils.findAnnotation(testContext.getTestClass(),
                LiquibaseChangeSet.class);
        if (annotation != null) {
            executeChangesets(testContext, annotation.changeSetLocations());
        }
    }

    private void executeChangesets(TestContext testContext, String[] changeSetLocation) throws SQLException,
            LiquibaseException {
        for (String location : changeSetLocation) {
            DataSource datasource = testContext.getApplicationContext().getBean(DataSource.class);
            DatabaseConnection database = new JdbcConnection(datasource.getConnection());
            Liquibase liquibase = new Liquibase(location, new FileSystemResourceAccessor(), database);
            liquibase.update(null);
        }
    }

}

ログにエラーはありませんNullPointerException。私のテストだけです。TestExecutionListenermy の使用がオートワイヤリングまたはインジェクションにどのように影響するかわかりません。

4

2 に答える 2

23

春の DEBUG ログを調べたところ、独自の TestExecutionListener を省略すると、Spring が DependencyInjectionTestExecutionListener を適切に設定することがわかりました。@TestExecutionListeners でテストにアノテーションを付けると、そのリスナーが上書きされます。

そのため、DependencyInjectionTestExecutionListener をカスタムのものに明示的に追加しただけで、すべて正常に動作します。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/applicationContext-test.xml" })
@TestExecutionListeners(listeners = { LiquibaseTestExecutionListener.class,
    DependencyInjectionTestExecutionListener.class })
@LiquibaseChangeSet(changeSetLocations = { "liquibase/v001/createTables.xml" })
public class DeviceDAOTest {
    ...

更新: 動作はここに文書化されています。

... または、 @TestExecutionListeners を使用してクラスを明示的に構成し、リスナーのリストから DependencyInjectionTestExecutionListener.class を省略することで、依存性注入を完全に無効にすることができます。

于 2013-03-29T13:54:16.677 に答える