[英]Hamcrest - Elegant way to test complex object with samepropertyvaluesas
我有相當復雜的對象結構(有一堆原始字段和對象引用),並且想要測試除 - 少數 - 之外的所有字段。 舉個例子;
ComplexObject actual = generateMagically("someInput");
ComplexObject expected = ActualFunction.instance.workMagically(actual);
// we want to be sure that workMagically() would create a new ComplexObject
// with some fields are different than "actual" object.
// assertThat(actual, samePropertyValuesAs(expected)); would check all fields.
// what I want is actually; - notice that "fieldName1" and "fieldName2" are
// primitives belong to ComplexObject
assertThat(actual, samePropertyValuesExceptAs(expected, "fieldName1", "fieldName2"))
由於我不想手動檢查所有字段,因此我相信必須有一種方法可以優雅地編寫該測試。 有任何想法嗎?
干杯。
你應該看看shazamcrest ,這是一個很棒的Hamcrest
擴展,可以提供你需要的東西。
assertThat(expected, sameBeanAs(expectedPerson).ignoring("fieldName1").ignoring("fieldName2"));
只需將要忽略的屬性列表作為第二個參數傳遞給 samePropertyValuesAs。
Hamcrest 匹配器 API
public static <B> Matcher<B> samePropertyValuesAs(B expectedBean, String... ignoredProperties)
例如
samePropertyValuesAs(salesRecord,"id")
一般來說,如果ComplexObject
可以自己修改,我會看到兩種解決方案。
您可以引入一個接口來表示由ActualFunction
更改的ComplexObject
的屬性。 然后,您可以測試該新界面的所有屬性是否都已更改。 這將要求ComplexObject
實現該新接口。
另一種方法是更換的特性ComplextObject
由改變ActualFunction
一個新的類型,包含所有這些屬性的新屬性。 更好的設計是讓ActualFunction
返回新類型的實例。
上次我有類似的要求時,我得出的結論是,手動編寫代碼和測試來斷言某些值已更新本質上是脆弱且容易出錯的。
我將 bag 對象中的字段外部化,並在編譯時為 bag 類本身和復制器生成了 Java 源文件。 通過這種方式,您可以測試實際代碼(生成器)並將域的實際定義准確地放在一個地方,因此復制代碼不會過時。
描述屬性的語言可以是任何你喜歡的語言,從 JSON 模式到 XML 再到 Java 本身(Java 示例如下 - 將從生成器中使用自定義注釋)
public class MyBag {
@Prop public int oh;
@Prop public String yeah;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.