亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 實體類及其單元測試的良好實踐

Java 實體類及其單元測試的良好實踐

慕田峪7331174 2023-02-23 18:20:31
我只想確認你們是否認為這是一個好習慣:使用 javax.validation.constraints 注釋用一些驗證在 java 中編寫實體類編寫單元測試以斷言驗證編寫單元測試來斷言 getter 和 setter,因為這是一種斷言該類包含我們需要的所有字段的方法@Builder@AllArgsConstructor@NoArgsConstructor@EqualsAndHashCode(callSuper = true)@ToString(exclude = "client")@Data@Entity@Table(name = "addresses")public class Address extends BaseEntity {  private static final long serialVersionUID = -5966581124342250987L;  @NotNull  @Size(min = 2, max = 40)  @Column(name = "line1", nullable = false, length = 40)  private String line1;  @Size(min = 2, max = 40)  @Column(name = "line2", length = 40)  private String line2;  @NotNull  @Size(min = 2, max = 40)  @Column(name = "city", length = 40)  private String city;  @NotNull  @Size(min = 2, max = 2)  @Column(name = "country_code", length = 2)  private String countryCode; //code ISO 3166 two-letter country codes  @NotNull  @EqualsAndHashCode.Exclude  @ManyToOne(fetch = FetchType.LAZY)  @JoinColumn(name = "client_id")  private Client client;}
查看完整描述

3 回答

?
慕碼人2483693

TA貢獻1860條經驗 獲得超9個贊

實體只是沒有邏輯的 POJO 對象。了解您究竟測試了什么是值得的。

如果你想測試實體驗證器,那么放置一些隨機數據而不是預定義的數據是值得的

不但是private static final String ADDRESS_LINE1 = "Address line 1";_

?Address?address?=?Address.builder()
????????????.line1(?randomAddress()?)
????????????.city(?randomCity()?)
????????????.countryCode(?randomCountry()?)
????????????.build()

random*()返回一些有效返回值的預定義方法在哪里。

如果你想測試Hibernate和mappers,值得考慮一些像H2這樣的嵌入式數據庫來做測試。

關于 getter 和 setter,大多數時候它們是自動生成的,這就是為什么我看不到測試它們的意義。


查看完整回答
反對 回復 2023-02-23
?
犯罪嫌疑人X

TA貢獻2080條經驗 獲得超4個贊

實體是數據庫的增強鏡像(實例是 SSOT,類是 SVOT),M im MVC,它們是 beans。Bean 是否應該進行單元測試:否。

你所做的是在實體中混合 M 和 C。C應該進行單元測試嗎?Yes!!!.

所以你真的應該測試它們!


查看完整回答
反對 回復 2023-02-23
?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

請注意,實際上您只測試了所用內容的一小部分:例如,所有和無參數構造函數、setterhashCode()equals()沒有經過測試。

現在測試它是一個好習慣嗎?我認為是的。
使用 Lombok 注釋生成一些實現,您只能在運行時(測試和應用程序運行時)驗證行為。
例如,注釋可能不會產生預期的行為,因為與另一個注釋沖突或使用不當(例如,如果生成的方法中存在循環,則會出現 stackoverflow 錯誤),您可能只會在運行時發現這些行為,充其量只能清楚地說明異常問題或最壞的情況是根本原因不明顯的潛在錯誤。
同樣,如果有人通過替換它(出于調試目的)而無意中破壞了實現:

@ToString(exclude = "client")

經過 :

@ToString

您希望自動測試檢測到它。
最后,如果您出于任何原因想要刪除項目的 Lombok,您希望進行回歸測試,以斷言沒有 Lombok 的新實現仍然是正確的。
所以是的,使用許多注釋意味著編寫許多斷言/測試。
但在某種程度上這是正常的,因為第三方 API 為您的類提供動力并不是一個細節。
請注意,對于 getter/setter,我認為測試它們不會帶來很大的價值,因為能夠調用它們通常意味著它們已由 Lombok 正確實現。

用這些術語進行推理(統一測試您的類 API 提供的內容)有利于生成有用且高質量的代碼,因為我們在添加生成某些代碼/邏輯的注釋之前會三思而后行。這是一件好事,因為我經常看到濫用 Lombok 注釋:“我們不確定是否需要它,但沒問題,因為它很容易聲明”。

我將對注釋應用完全相同的想法, javax.validation.constraints而對于驗證問題,我可能會使用參數化測試來減少樣板代碼。


查看完整回答
反對 回復 2023-02-23
  • 3 回答
  • 0 關注
  • 334 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號