在使用AssertJ进行断言时,如果需要根据实际值忽略某些字段,可以使用自定义比较器或者自定义条件来实现。以下是两种解决方法的代码示例:
import org.assertj.core.api.AbstractObjectAssert;
import org.assertj.core.api.Condition;
import org.assertj.core.api.ObjectAssert;
import org.assertj.core.internal.Iterables;
import java.util.Objects;
public class CustomComparatorExample {
public static class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getters and Setters
}
public static void main(String[] args) {
Person actual = new Person("John", 30);
Person expected = new Person("John", 25);
ObjectAssert personAssert = assertThat(actual, usingComparatorForFields((field, actualValue, expectedValue) -> {
if ("age".equals(field.getName())) {
// 忽略age字段的比较
return true;
}
// 使用默认的比较器比较其他字段
return Objects.equals(actualValue, expectedValue);
}, "name"));
personAssert.isEqualTo(expected);
}
public static ObjectAssert assertThat(T actual, Condition super T> condition, String... propertiesOrFieldsUsedInMessage) {
return new ObjectAssert<>(actual, condition, propertiesOrFieldsUsedInMessage);
}
public static ObjectAssert assertThat(T actual, Condition super T> condition) {
return new ObjectAssert<>(actual, condition);
}
public static ObjectAssert assertThat(T actual) {
return new ObjectAssert<>(actual);
}
public static AbstractObjectAssert, T> assertThat(T actual, Class clazz) {
return new ObjectAssert<>(actual, clazz);
}
public static AbstractObjectAssert, T> assertThat(T actual, Class clazz, String... propertiesOrFieldsUsedInMessage) {
return new ObjectAssert<>(actual, clazz, propertiesOrFieldsUsedInMessage);
}
public static AbstractObjectAssert, T> assertThat(T actual, String... propertiesOrFieldsUsedInMessage) {
return new ObjectAssert<>(actual, propertiesOrFieldsUsedInMessage);
}
public static AbstractObjectAssert, T> assertThat(T actual, String description, String... propertiesOrFieldsUsedInMessage) {
return new ObjectAssert<>(actual, description, propertiesOrFieldsUsedInMessage);
}
public static Condition usingComparatorForFields(Iterables.GetByFieldOrPropertyName getter,
Comparator super Object> comparator,
String... fields) {
return new Condition<>(new FieldOrPropertyComparator<>(getter, comparator, fields));
}
public static Condition usingComparatorForFields(Condition super Object> condition, String... fields) {
return new Condition<>(new FieldOrPropertyComparator<>(Iterables::getByFieldOrPropertyName, condition, fields));
}
}
import org.assertj.core.api.AbstractObjectAssert;
import org.assertj.core.api.Condition;
import org.assertj.core.api.ObjectAssert;
import org.assertj.core.internal.Iterables;
import java.util.Objects;
public class CustomConditionExample {
public static class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getters and Setters
}
public static void main(String[] args) {
Person actual = new Person("John", 30);
Person expected = new Person("John", 25);
ObjectAssert personAssert = assertThat(actual, ignoringFields("age"));
personAssert.isEqualTo(expected);
}
public static ObjectAssert assertThat(T actual, Condition super T> condition, String... propertiesOrFieldsUsedInMessage) {
return new ObjectAssert<>(actual, condition, propertiesOrFieldsUsedInMessage);
}
public static ObjectAssert assertThat(T actual, Condition super T> condition) {
return new ObjectAssert<>(actual, condition);
}
public static ObjectAssert assertThat(T actual) {
return new ObjectAssert<>(actual);
}
public static AbstractObjectAssert, T> assertThat(T actual, Class clazz) {
return new ObjectAssert<>(actual, clazz);
}
public static Abstract
上一篇:Assert.Throws方法没有捕获到预期的异常。
下一篇:assertAlmostEqual函数提示TypeError:'str'cannotbeinterpretedasaninteger,尽管已经进行了isinstance检查。