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

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

JUnit5:如何通過單個斷言調用斷言一個對象的多個屬性?

JUnit5:如何通過單個斷言調用斷言一個對象的多個屬性?

慕妹3146593 2023-06-04 17:41:05
我想通過一次斷言調用來斷言一個對象的多個屬性。使用 JUnit 4 和 Hamcrest 我會寫這樣的東西:assertThat(product, allOf(        hasProperty("name", is("Coat")),        hasProperty("available", is(true)),        hasProperty("amount", is(12)),        hasProperty("price", is(new BigDecimal("88.0")))));問:如何使用 JUnit 5 和 AssertJ 在單個斷言調用中斷言多個屬性?或者,或者,在 JUnit 5 世界中最好的方法是什么。注意:我當然可以創建一個具有所有需要的屬性的對象并執行assertThat(actualProduct, is(expectedProduct))但這不是重點。
查看完整描述

3 回答

?
慕斯709654

TA貢獻1840條經驗 獲得超5個贊

使用 AssertJ,另一種選擇是使用returns

import static org.assertj.core.api.Assertions.from;


assertThat(product)

? ? .returns("Coat", from(Product::getName))

? ? .returns(true, from(Product::getAvailable))

? ? ?//

? ? ?// or without 'from()'

? ? ?//

? ? .returns(12, Product::getAmount)

? ? .returns(new BigDecimal("88.0"), Product::getPrice);

有點冗長,但我發現與extracting/相比更容易閱讀contains。

請注意,這from只是一個可選的語法糖,以提高可讀性。


從 3.22.0 開始,doesNotReturn也可用。這對于事先不知道預期值的非空字段很有用。

assertThat(product)
????.returns("Coat",?from(Product::getName))
????.returns(true,?from(Product::getAvailable))
????.doesNotReturn(42,?from(Product::getAmount))
????.doesNotReturn(null,?from(Product::getPrice));


查看完整回答
反對 回復 2023-06-04
?
烙印99

TA貢獻1829條經驗 獲得超13個贊

使用 AssertJ 最接近的是:

assertThat(product).extracting("name", "available", "amount", "price")
                   .containsExactly("Coat", true, 12, new BigDecimal("88.0"));

但我不喜歡用Strings 引用字段名稱,因為它們作為字段名稱的有效性僅在運行時檢查(已知的反射問題),并且這些Strings 也可能在我們從 IDE 執行的重構操作期間被錯誤地更新。

雖然有點冗長,但我更喜歡:

assertThat(product).extracting(Product::getName, Product::getAvailable, 
                               Product::getAmount, Product::getPrice)
                   .containsExactly("Coat", true, 12, new BigDecimal("88.0"));

您引用的 AssertJ 優于 Hamcrest 的優勢在于它非常流暢:因此在大多數情況下,您需要一次導入:import org.assertj.core.api.Assertions;對于集合斷言,有時需要:org.assertj.core.groups.Tuple;

這里是 JUnit 5 或 4;這并不重要,因為對于非常簡單的情況,您只會將 JUnit 用作測試運行程序,而讓 AssertJ 執行斷言。

或者,或者,在 JUnit 5 世界中最好的方法是什么。

JUnit 5(作為第 4 個版本)不提供靈活流暢的斷言功能。因此,使用 JUnit 5 的最佳方式來做這件事必然會產生更多的樣板代碼:與要斷言的字段一樣多的斷言或出于公平原因equals()/hashCode()要避免的重寫。


查看完整回答
反對 回復 2023-06-04
?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

你可以使用Assertions.assertAll:


assertAll("product",

? ?() -> assertEquals("Coat", product.getName()),

? ?() -> assertTrue(product.isAvaikable())

);

assertAll 可以接受任意多的單獨斷言。

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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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