)
У меня довольно необычное требование для серии юнит-тестов, которые я исправляю. По сути, необходимо использовать другой источник данных / менеджер транзакций в зависимости от имени метода модульного теста.
Например, если имя теста заканчивается на 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 уже настроил все компоненты (дох!).
Есть ли какой-то другой механизм, который я могу использовать, чтобы заставить это работать?
Большое спасибо за ваше время.