мы пытаемся написать тесты для нашего весеннего загрузочного приложения, и столкнулись с очень специфической и странной проблемой. Нам нужно протестировать наши репозитории и использовать аннотацию Spring @DataJpaTest
для быстрого создания базы данных h2 в памяти и получения связанных bean-компонентов. Но в одном из наших тестов, когда мы пытаемся удалить объект с помощью репозитория Spring, он не удаляется. Когда мы обычно запускаем приложение и пытаемся удалить его с помощью запроса REST на наши контроллеры, оно работает как чудо, но в тестах это не так.
Когда мы удаляем аннотацию @DataJpaTest
и заменяем ее на пару других аннотаций, это работает. Это не рабочая установка
@RunWith(SpringRunner.class)
@DataJpaTest
public class NodeInfoServiceIT {
//Some tests here
@Test
public void deleteNode_deleteNode_returnSuccessMessage() {
//We create our Service annotated class in here by hand, and call delete
//node function and check whether it is deleted or not, but it isn't
}
deleteNode выполняет некоторую проверку крайних случаев и просто вызывает delete в нашем весеннем репозитории. Нам удалось это сделать, немного изменив аннотации, но это шатко, и здесь неоптимальны рабочие аннотации:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MyApplication.class)
@TestPropertySource(
locations = "classpath:integrationtest-application.properties")
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
и указанный application.properties довольно прост:
spring.datasource.url = jdbc:h2:mem:test
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.H2Dialect
Если мы поместим @Transactional поверх нашего тестового класса, он будет работать как в аннотированном состоянии.
Если мы не добавим аннотацию @DirtiesContext, она не будет работать, поскольку мы помещаем одни и те же данные для всех наших тестов, а когда они пытаются внедрить данные, это завершается неудачей с ограничением, которое не является удовлетворительным исключением.
У меня вопрос, в чем проблема с первым методом аннотации и как я могу это исправить.
Спасибо.