У меня есть простое приложение Spring Boot, использующее репозитории Spring Data JDBC и предоставляющее REST API. Кажется, все работает нормально, за исключением моих интеграционных тестов. См. Ниже выдержку из конфигурации репозитория.
@Configuration
@EnableJdbcRepositories
class RepositoryConfig : AbstractJdbcConfiguration() {
@Bean
@Profile("int-test")
fun intTestDataSource(): DataSource {
return EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript("sql/h2/schema_create.sql")
.build()
}
@Bean
fun namedParameterJdbcOperations(dataSource: DataSource): NamedParameterJdbcOperations {
return NamedParameterJdbcTemplate(dataSource)
}
@Bean
fun transactionManager(dataSource: DataSource): TransactionManager {
return DataSourceTransactionManager(dataSource)
}
}
Далее следует интеграционный тест.
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@ActiveProfiles("int-test")
@Transactional
class OrganizationControllerIntTest {
@Autowired
private lateinit var organizationRepository: OrganizationRepository
@Autowired
private lateinit var restTemplate: TestRestTemplate
@Autowired
private lateinit var testDataGenerator: TestDataGenerator
@BeforeEach
fun beforeEach() {
val organizations = testDataGenerator.organizations(10).toList()
organizationRepository.saveAll(organizations)
}
@Test
fun `When GET organizations then return all organizations`() {
val result = restTemplate.getForEntity("/organizations", String::class.java)
assertThat(result?.statusCode, equalTo(HttpStatus.OK))
assertThat(result?.body, containsString("items"))
}
}
Тест считается успешным, если @Transactional
аннотация не применена. Поскольку мне нужно, чтобы изменения откатывались после каждого теста, я хотел бы сделать тесты транзакционными. Проблема в том, что в этом случае ответ не содержит никаких элементов, например, база данных будет пустой, и я не могу понять, почему.