Skip to content

Data Verify Guide

jitwxs edited this page May 4, 2022 · 2 revisions

Data Verify 功能基于 assertj 实现,在此基础上封装了统一的 API,并增加了额外的功能。

01 VerifyInstance

使用 EasyVerify.with(xxx, yyy) 方法即可得到 VerifyInstance 实例对象,您可直接调用 verify() 方法进行断言,也可在调用前进行一些前置的配置。

1.1 忽略字段

默认情况比较两个对象时,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());

1.2 指定字段

与忽略字段方法相对应,您可通过该方法,让 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());

1.3 忽略类型差异

默认情况下,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();

1.4 精度误差

对于数值型的比较,可以通过 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());