在 junit 中断言 UUID

Asserting UUID in junit

我有一个构建对象的方法 returns。

作为 UUID 作为其字段之一的对象。在构建对象时,会生成随机 UUID。这是代码:

public MetaData getMetaData(String id) {
  return MetaData.newBuilder().setId(id)
    .setCorrelationId(UUID.randomUUID().toString())
    .setCreatedAt(now(UTC).format(ISO_ZONED_DATE_TIME))
    .build();
}

这是我的测试:

@Test
public void shouldVerifyIfTheMetaDataIsBuild() {

  MetaData metaData = handler.getMetaData("1234");

  assertThat(metaData.getId(), is("1234"));
  assertThat(metaData.getCorrelationId(), isNotNull());
}

我只是在验证 correlationId 是否不为空。有没有更好的方法来验证UUID?

验证当前生产代码的唯一方法是,是的,检查 CorrelationId 是否不为空。您还可以检查预期字符串的布局是否与有效的 UUID 字符串匹配。

当然,如果您想进行更好的检查,只需将 UUID.randomUUID().toString() 替换为您可以 控制.[=13= 的内容即可]

例如,您可以创建一个 UUIDGenerator 接口,使用默认方法创建一个 随机 UUID,如您的代码所示。但是在您的测试设置中,您改为提供该接口的实现 returns 一个 特定的 UUID。

然后你的测试代码可以知道应该使用哪个UUID,并且assertThat(actualUuid, is(expectedUuid))

我会更改此行:

assertThat(metaData.getCorrelationId().toString(), isNotNull());

以下内容:

assertThat(metaData.getCorrelationId(), isNotNull());

否则你会得到 NullPointerException if metaData.getCorrelationId() returns null 而不是断言失败。

此外,您可以通过尝试解析它来测试 metaData.getCorrelationId() returns 是否代表有效 UUID 的字符串:

try {
    UUID.fromString(metaData.getCorrelationID());
} catch (IllegalArgumentException e) {
    fail("Correlation ID is not a valid UUID: " + metaData.getCorrelationId());
}

正如@GhostCat 所说的那样,由于我们无法控制 UUID.randomUUID(),唯一的方法是检查生成的 UUID 是否不为空。为此,您可以使用以下代码:

assertNotNull(metaData.getCorrelationId());

关于 UUID 您可以验证的另一件事是它的长度(因为它总是 36 )。

将来有机会检测实施中的变化。

使用 UUID 时,我使用正则表达式检查字符串模式。

assertTrue(id.matches(Pattern("([a-f0-9]{8}(-[a-f0-9]{4}){4}[a-f0-9]{8})")))

通过这种方式,我检查它是否存在以及字符串是否确实是一个 UUID,因为我碰巧发生了一个意外的更改,在那里放置了一个 space,这将传递 assertNotNull 解决方案。

我向 Apache Commons Validator 添加了一个 UUID 验证器。它尚未合并,但您可以在这里投票:https://github.com/apache/commons-validator/pull/68