我们正在尝试为我们的Spring Boot应用程序编写测试,并且遇到了一个非常具体而奇怪的问题。我们需要测试我们的存储库,并使用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进行一些边缘情况检查,仅在我们的spring存储库上调用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批注,那么它将不起作用,因为我们为所有测试放置了相同的数据,并且当它尝试注入数据时,它将因约束不令人满意的异常而失败。 我的问题是第一个注释方法有什么问题,我该如何解决。
谢谢。