Как использовать другой источник данных Spring в зависимости от имени модульного теста? - PullRequest
0 голосов
/ 29 апреля 2019

)

У меня довольно необычное требование для серии юнит-тестов, которые я исправляю. По сути, необходимо использовать другой источник данных / менеджер транзакций в зависимости от имени метода модульного теста.

Например, если имя теста заканчивается на UseDB2, то мы используем источник данных DB2, если это UseH2, то мы используем источник данных H2.

Я думал, что для этого нужно использовать AbstractRoutingDatasource, предоставляемый средой Spring.

public class TestRoutingDatasSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {

        return DatabaseContextHolder.getDatabaseType();

    }
}

Использование держателя контекста для выбора необходимого источника данных:

public class DatabaseContextHolder {

    private static final ThreadLocal<DType> contextHolder = new ThreadLocal<DType>();

    public static void setDatabaseType(DType databaseType) {
        contextHolder.set(databaseType);
    }

    public static DType getDatabaseType() {
        return (DType) contextHolder.get();
    }

    public static void clearDatabaseType() {
        contextHolder.remove();
    }
}

Затем я собирался использовать имя теста, чтобы установить контекст; как то так:

public class MyDBUnitTestCase extends
        AbstractTransactionalDataSourceSpringContextTests {

    protected DataSource dataSource;

    protected String schemaName;

    public void setDataSource(DataSource aDataSource) {
        this.dataSource = aDataSource;
    }

    public void setSchemaName(String aSchemaName) {
        this.schemaName = aSchemaName;
    }

    protected void onSetUp() throws Exception {
        super.onSetUp();


        if (getName().endsWith("UsingDB2")) {

            DatabaseContextHolder.setDatabaseType(DType.DB2);
        }
        else {
            DatabaseContextHolder.setDatabaseType(DType.H2);
        }

    }

Но, конечно, это не сработает, потому что к тому времени, когда я приехал, чтобы проверить название теста, Spring уже настроил все компоненты (дох!).

Есть ли какой-то другой механизм, который я могу использовать, чтобы заставить это работать?

Большое спасибо за ваше время.

...