[英]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.