在junit中断言UUID

6

我有一个方法,它构建一个对象并返回它。

该对象的一个字段是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


似乎你不想进行静态模拟。在这种情况下,检查它是否为空或者长度为UUID字符串的长度可能已经足够了。 - ernest_k
是的,我不想进行静态模拟。 - Thiru
6个回答

7
唯一验证当前生产代码的方法是,确保CorrelationId不为null。您还可以检查预期字符串的布局是否与有效的UUID字符串匹配。
当然,如果您想要更好的检查,那么只需要将"UUID.randomUUID().toString()"替换为您可以控制的内容即可。
例如,您可以创建一个UUIDGenerator接口,并使用默认方法创建一个随机UUID,如您的代码所示。但在测试设置中,您提供该接口的实现,该实现返回特定的UUID。
然后,您的测试代码就可以知道应该使用哪个UUID,且可以使用"assertThat(actualUuid, is(expectedUuid))"进行断言。

6

我会将这行代码进行修改:

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

to the following:

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

否则,如果metaData.getCorrelationId()返回null而不是断言失败,您将会得到一个NullPointerException。
此外,您可以通过尝试解析它来测试metaData.getCorrelationId()是否返回表示有效UUID的字符串。
try {
    UUID.fromString(metaData.getCorrelationID());
} catch (IllegalArgumentException e) {
    fail("Correlation ID is not a valid UUID: " + metaData.getCorrelationId());
}

谢谢!我的错,我已经更新了问题。移除了toString()方法。 - Thiru
1
@GhostCat,根据 OP 的代码,metaData.getCorrelationID() 显然是一个 String - Jesper
糟糕,原始问题中有太多令人困惑的 toString() 调用了...你是对的! - GhostCat

3

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

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

我这样检查它是否存在,并且确保字符串确实是UUID,因为我曾经遇到过意外的更改导致在assertNotNull解决方案中通过空格的情况。


在Java中更适合匹配模式的方式是Pattern.matches("([a-f0-9]{8}(-[a-f0-9]{4}){4}[a-f0-9]{8})", metaData.getCorrelationID()); - Faraz

1

1

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接