簡體   English   中英

為什么刪除在應用程序中有效但在測試中無效?

[英]Why is delete working in app but not in tests?

這是我的情況。

Category.java

@Getter
@Entity
@NoArgsConstructor
public class Category {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;
  private String name;

  @ManyToOne
  @JoinColumn(name = "masterCategory.id")
  private MasterCategory masterCategory;

  @OneToMany(mappedBy = "category", cascade = CascadeType.ALL, orphanRemoval = true)
  private List<Expense> expenses = new ArrayList<>();

}

Expense.java

@Getter
@Entity
@NoArgsConstructor
public class Expense {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;
  private BigDecimal amount;
  private String itemName;
  private LocalDateTime expenseDate;
  private String shopName;
  private boolean isIncome;

  @ManyToOne
  @JoinColumn(name = "shop.id")
  private Shop shop;

  @ManyToOne
  @JoinColumn(name = "bankingAccount.id")
  private BankingAccount bankingAccount;

  @ManyToOne
  @JoinColumn(name="category.id")
  private Category category;

  @ManyToOne
  @JoinColumn(name = "userAccount.id")
  private UserAccount userAccount;

  @ManyToOne
  @JoinColumn(name = "userGroup.id")
  private UserGroup userGroup;

}

如我們所見,它們通過關系鏈接在一起。 對於每個此類,我還具有簡單的服務,存儲庫和控制器(春季啟動)。 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的SQL,從數據庫中刪除了正確的行),但是在運行測試時,將引發以下異常:

java.lang.AssertionError:[]:期望2個值但得到3個

在測試中,delete給了我http 200,但顯然不是刪除該元素。 也沒有帶刪除的SQL。 為什么? 我做錯了什么?

感謝潛在客戶。 經過一些調試后,我意識到測試的行為是這樣的,因為@Transactional位於測試類的頂部。 我這樣做是為了在每種方法后刷新數據庫。 我用@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)替換了它,一切似乎都正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM