В конце концов нашел ответ: по сути, есть 2 подхода:
использование @Profile и @ActiveProfile
Скрыть реальное / overide real DS через расширение класса конфигурации реального кода
1.
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(....)
@EntityScan(basePackages = "...")
public class RepositoryConfig {
@Value("${ds-jndi-name}")
private String dataSourceJndiname;
@Bean("myDs")
public DataSource dataSource() {
JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
return dataSourceLookup.getDataSource(dataSourceJndiname);
}
.....
}
2
@Configuration
public class RepositoryConfigTest extends RepositoryConfig{
@Value("${ds-jndi-name}")
private String dataSourceJndiname;
@Primary
@Bean("myDs")
@SneakyThrows
public DataSource dataSource() {
EmbeddedDatabase datasource = new EmbeddedDatabaseBuilder()
.setType(HSQL)
.setSeparator(";")
.addScript("classpath:/inmemorytablesdefinitions.sql")
.build();
bindDS(datasource);
return datasource;
}
......
}
В репозитории, которые вы тест, который вы делаете:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {RepositoryConfigTest.class})
public class AppRepositoryTest {
private App givenApp;
@Autowired
private AppRepository appRepository;
@Before
public void setup() {
... whatever code
}
@Test
public void shoudReadApp() {
//given
.....
//when
.......
//then
assert ...
}
}
Теперь в контексте времени тестовой компиляции у нас есть DS в памяти, во время выполнения мы имеем реальный DS, взятый через поиск jndi. В + нужно проверить и поиск jndi, поскольку DS времени выполнения скрыт.
Преимущество этого в том, что мы не вынуждены заниматься обслуживанием профилей. Если в вашем коде еще используются профили.