Java 为什么删除在应用程序中有效,但在测试中无效?
这是我的箱子 Category.java 正如我们所看到的,它们是通过关系联系在一起的。 我还为每个类提供了简单的服务、存储库和控制器(SpringBoot)。CategoryService包含用于删除控制器的方法。这也很简单Java 为什么删除在应用程序中有效,但在测试中无效?,java,testing,spring-data-jpa,mockmvc,Java,Testing,Spring Data Jpa,Mockmvc,这是我的箱子 Category.java 正如我们所看到的,它们是通过关系联系在一起的。 我还为每个类提供了简单的服务、存储库和控制器(SpringBoot)。CategoryService包含用于删除控制器的方法。这也很简单 Category category = categoryRepository.selectCategory(getLoggedUsername(),groupId,masterCatId,categoryId); categoryRepository.delete(cat
Category category = categoryRepository.selectCategory(getLoggedUsername(),groupId,masterCatId,categoryId);
categoryRepository.delete(category);
return categoryConverter.toMinimalDto(category);
当我运行这个应用程序时,一切都很完美,从数据库中删除该类别,删除与该类别相关的费用。
有一天,我决定写测试,因为我厌倦了手工检查一切。试验方法如下:
@Test
@WithMockUser(username = LOGIN)
public void shouldDeleteCategoryAndConnectedExpenses__andReturn200() throws Exception {
//given
mvc.perform(get("/api/budget/1/master/1"))
.andExpect(status().isOk())
.andExpect(content().json(testUtil.openJson("categories/categoriesFromSelectedBudget.json")));
mvc.perform(get("/api/budget/1/master/1/category/1/expense"))
.andExpect(status().isOk())
.andExpect(content().json(testUtil.openJson("expenses/expensesFromCategory1.json")));
//when
mvc.perform(delete("/api/budget/1/master/1/category/1"))
.andExpect(status().isOk());
//then
mvc.perform(get("/api/budget/1/master/1"))
.andExpect(status().isOk())
.andExpect(content().json(testUtil.openJson("categories/categoriesAfterDelete.json")));
mvc.perform(get("/api/budget/1/master/1/category/1/expense"))
.andExpect(status().isNotFound());
}
我有一个专门的postgresDB
用于测试,这里我检查delete是否真的完成了它的工作。我通过检查响应JSON是否是我想要的JSON来实现这一点。简单的东西
- 第一个
(categoriesFromSelectedBudget.json)包含3个元素get
- 第三个
(categoriesAfterDelete.json)包含2个元素李>get
在测试中,delete给了我HTTP200,但它显然没有删除元素。此外,没有带delete的sql。为什么?我做错了什么?谢谢你的线索。经过一些调试后,我意识到测试的行为是这样的,因为测试类上有
@Transactional
。我这样做是为了在每个方法之后刷新数据库。我将其替换为@DirtiesContext(classMode=DirtiesContext.classMode.BEFORE\u EACH\u TEST\u METHOD)
,似乎一切正常。感谢您的指导。经过一些调试后,我意识到测试的行为是这样的,因为测试类上有@Transactional
。我这样做是为了在每个方法之后刷新数据库。我用@DirtiesContext(classMode=DirtiesContext.classMode.BEFORE\u EACH\u TEST\u METHOD)
替换了它,一切似乎都很好。你能发布你测试和应用程序的jpa数据库配置吗?由于您使用的是不同的数据库,某些设置可能不相同。是否尝试使用调试器查看是否运行了查询以及查询是什么。尝试在测试数据库上手动运行该查询,以查看它是否确实删除了该行。请发布测试和应用程序的jpa数据库配置,好吗?由于您使用的是不同的数据库,某些设置可能不相同。是否尝试使用调试器查看是否运行了查询以及查询是什么。尝试在测试数据库上手动运行该查询,以查看它是否确实删除了该行。
Category category = categoryRepository.selectCategory(getLoggedUsername(),groupId,masterCatId,categoryId);
categoryRepository.delete(category);
return categoryConverter.toMinimalDto(category);
@Test
@WithMockUser(username = LOGIN)
public void shouldDeleteCategoryAndConnectedExpenses__andReturn200() throws Exception {
//given
mvc.perform(get("/api/budget/1/master/1"))
.andExpect(status().isOk())
.andExpect(content().json(testUtil.openJson("categories/categoriesFromSelectedBudget.json")));
mvc.perform(get("/api/budget/1/master/1/category/1/expense"))
.andExpect(status().isOk())
.andExpect(content().json(testUtil.openJson("expenses/expensesFromCategory1.json")));
//when
mvc.perform(delete("/api/budget/1/master/1/category/1"))
.andExpect(status().isOk());
//then
mvc.perform(get("/api/budget/1/master/1"))
.andExpect(status().isOk())
.andExpect(content().json(testUtil.openJson("categories/categoriesAfterDelete.json")));
mvc.perform(get("/api/budget/1/master/1/category/1/expense"))
.andExpect(status().isNotFound());
}