我想檢查兩個串列(比如說,ArrayLists)是否具有完全相同的實體類,基于預期的串列。為此,我構建了下一個方法,但我想知道是否還有另一種使用某些庫的奇特方法,例如 assertJ。
private void assertConcreteTypes(List actual, List expected) {
for (int i = 0; i < actual.size(); i ){
assertThat(actual.get(i)).isExactlyInstanceOf(expected.get(i).getClass());
}
}
任何建議都會受到歡迎。謝謝!
uj5u.com熱心網友回復:
您可以創建自定義 Assertj 斷言器和可用于對型別進行斷言的自定義斷言器。
class TypeAssert extends AbstractAssert<TypeAssert, List<?>> {
public TypeAssert(List<?> actual) {
super(actual, TypeAssert.class);
}
public TypeAssert hasElementsOfExactlyTheSameTypeAs(List<?> expected) {
isNotNull();
for (int i = 0; i < actual.size(); i ) {
if (!actual.get(i).getClass().equals(expected.get(i).getClass())) {
failWithMessage("Expected [%s]th element to be of type: %s but was of type: %s",
i, expected.get(i).getClass(), actual.get(i).getClass());
}
}
return this;
}
}
您將需要一個靜態方法來公開我們的自定義匯出器的物件。
class Assertions {
// static factory method which exposes custom asserted
static TypeAssert assertThat(List<?> actual) {
return new TypeAssert(actual);
}
}
然后你可以使用上面的方法進行基于型別的斷言。
List<Object> actual = List.of(new Employee());
List<Object> expected = List.of(new StringBuilder());
Assertions.assertThat(actual).hasElementsOfExactlyTheSameTypeAs(expected);
如果您僅在 1 或 2 個位置基于型別進行斷言,那么我填寫您提到的方法更加清晰易讀。但是如果你需要在幾個地方進行這樣的斷言,那么我填寫你應該創建一個自定義的 Asserter。
uj5u.com熱心網友回復:
您需要考慮不同大小的串列以及串列中的空元素。
這似乎非常易讀,并迎合了這些邊緣情況:
private void assertConcreteTypes(List actual, List expected) {
assertEquals(classes(expected), classes(actual));
}
private List<Class<?>> classes(List<Object> list) {
return list.stream().map(v -> v == null ? null : v.getClass()).collect(Collectors.toList());
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/468155.html
上一篇:AngularDOM測驗
