-
Notifications
You must be signed in to change notification settings - Fork 2
Data Verify Guide
jitwxs edited this page May 4, 2022
·
2 revisions
Data Verify 功能基于 assertj
实现,在此基础上封装了统一的 API,并增加了额外的功能。
使用 EasyVerify.with(xxx, yyy) 方法即可得到 VerifyInstance
实例对象,您可直接调用 verify()
方法进行断言,也可在调用前进行一些前置的配置。
默认情况比较两个对象时,EasyMock 会逐个字段的进行比较,您可通过该方法,忽略掉一些不想比较的字段。
// student 和 student2 两个对象,name 属性不一致
final MockConfig mockConfig = new MockConfig().setStringEnum(MockStringEnum.CN_NAME);
final Student student = new Student();
student.setSex(EnumProto.SexEnum.MALE);
student.setName(run(String.class, mockConfig));
final Student student2 = new Student();
student2.setSex(EnumProto.SexEnum.MALE);
student2.setName(run(String.class, mockConfig));
assertDoesNotThrow(() -> EasyVerify.with(student, student2).ignoredFields("name").verify());
与忽略字段方法相对应,您可通过该方法,让 EasyMock 仅校验指定的字段。
// user1 和 user2 只有 age 字段是相等的
final UserInfo user1 = UserInfo.builder()
._id(run(String.class, new MockConfig().setStringEnum(MockStringEnum.CN_NAME)))
.age(15)
.email(run(String.class, new MockConfig().setStringEnum(MockStringEnum.EMAIL)))
.build();
final UserInfo user2 = UserInfo.builder()
._id(run(String.class, new MockConfig().setStringEnum(MockStringEnum.CN_NAME)))
.age(15)
.email(run(String.class, new MockConfig().setStringEnum(MockStringEnum.EMAIL)))
.build();
assertDoesNotThrow(() -> EasyVerify.with(user1, user2).validateFields("age").verify());
默认情况下,EasyMock 会判断 with
方法的两个参数的类型,如果类型不一致,那么就直接校验失败了。您可通过该方法,让 EasyMock 不比较二者的类型差异。
// java 枚举和 proto 枚举不能直接比较
assertThrows(AssertionError.class, () -> with(EnumProto.SexEnum.MALE, SexEnum.MALE).verify());
assertDoesNotThrow(() -> with(EnumProto.SexEnum.MALE, SexEnum.MALE).ignoreClassDiff().verify());
// arrayList 和 linkedList 类型不一致,虽然元素相同,但也不能直接比较
final Collection<EnumProto.SexEnum> enums1 = Lists.newArrayList(EnumProto.SexEnum.MALE, EnumProto.SexEnum.FEMALE);
final Collection<EnumProto.SexEnum> enums2 = new LinkedList<>(Arrays.asList(EnumProto.SexEnum.MALE, EnumProto.SexEnum.FEMALE));
assertDoesNotThrow(() -> EasyVerify.with(enums1, enums2).ignoreClassDiff().verify());
// proto 对象和 java 对象,虽然字段相同,但也不能直接比较
final OrderEvaluate evaluate = EasyMock.run(OrderEvaluate.class);
final MessageProto.OrderEvaluate evaluate1 = OrderEvaluateConvert.db2Proto(evaluate);
EasyVerify.with(evaluate, evaluate1).ignoreClassDiff().verify();
对于数值型的比较,可以通过 withPrecision
方法指定精度的误差值,只有二者的误差超过了该配置,EasyMock 才认为二者是不同的。
final Integer a = 1, b = 2;
assertDoesNotThrow(() -> EasyVerify.with(a, b).withPrecision(1).verify());
assertThrows(AssertionError.class, () -> EasyVerify.with(a, b).withPrecision(0.9).verify());
assertDoesNotThrow(() -> EasyVerify.with(valueOf(1), valueOf(1.1)).withPrecision(valueOf(0.1)).verify());
Author: jitwxs@foxmail.com