Java 为什么删除在应用程序中有效,但在测试中无效?

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.java

正如我们所看到的,它们是通过关系联系在一起的。 我还为每个类提供了简单的服务、存储库和控制器(SpringBoot)。CategoryService包含用于删除控制器的方法。这也很简单

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来实现这一点。简单的东西

  • 第一个
    get
    (categoriesFromSelectedBudget.json)包含3个元素
  • 第三个
    get
    (categoriesAfterDelete.json)包含2个元素
这些JSON是100%正确的

问题是:为什么当应用程序运行时,一切都正常工作(我可以看到带有delete的SQLs,正确的行从DB中删除),但当测试运行时,会引发以下异常:

java.lang.AssertionError:[]:应为2个值,但得到3个值


在测试中,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());
}