在 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
我有一个构建对象的方法 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