【问题标题】:Asserting UUID in junit在junit中断言UUID
【发布时间】:2018-12-23 16:43:35
【问题描述】:

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

作为 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 字符串的长度等。
  • 是的。我不想做静态模拟

标签: java junit uuid


【解决方案1】:

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

当然,当您想要更好地检查时,您只需将UUID.randomUUID().toString() 替换为您可以控制的东西。

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

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

【讨论】:

    【解决方案2】:

    我会改变这一行:

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

    到以下:

    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()
    • @GhostCat metaData.getCorrelationID() 显然是String 正在查看 OP 的代码。
    • Uups。在那个原始问题中有太多令人困惑的toString() 电话......你是对的!
    【解决方案3】:

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

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

    通过这种方式,我检查它是否存在以及字符串是否确实是 UUID,因为发生意外的更改会在其中放置一个空格,该空格将在 assertNotNull 解决方案中传递。

    【讨论】:

    • 在java中匹配Pattern的更恰当的方法是Pattern.matches("([a-f0-9]{8}(-[a-f0-9]{4}){4}[a-f0-9]{8})", metaData.getCorrelationID());
    【解决方案4】:

    关于 UUID,您可以验证的另一件事是它的长度(因为它始终是 36 java.util.UUID.randomUUID().toString() length)。

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

    【讨论】:

      【解决方案5】:

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

      assertNotNull(metaData.getCorrelationId());
      

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-12
          • 1970-01-01
          • 2010-12-20
          相关资源
          最近更新 更多