【问题标题】:Testing random salt method测试随机盐法
【发布时间】:2020-04-13 13:47:05
【问题描述】:

我试图弄清楚如何使用 JUnit 测试此方法。此方法创建长度为 x 的随机盐

public static String getSalt(int length) {
    StringBuilder returnValue = new StringBuilder(length);
    for (int i = 0; i < length; i++) { 
        returnValue.append(ALPHABET.charAt(SECURE.nextInt(ALPHABET.length())));
    }
    return new String(returnValue);
}

我可以测试输出的长度是否根据我为方法提供的整数,但我想知道的是如何测试随机性,或者这可能是我不需要做的事情?

【问题讨论】:

  • 您可以测试正则表达式是否与生成的字符串匹配

标签: java unit-testing random junit salt


【解决方案1】:

你不能测试随机性,或者即使这是一个要求,它也应该超出范围(它的复杂性比被测试的实际方法要大得多)。

确实,您可以测试的是长度是否正确,并且只测试此方法的两次调用的随机性。

【讨论】:

    【解决方案2】:

    您可以测试生成的 String 是否与可以使用或启发的 sn-p 以下的长度 = X 的字母正则表达式匹配:

    Assert.assertTrue(producedString.matches("^[A-Za-z]{X}$")
    

    regex^[A-Za-z]{X}$,其中 X 是字符串的长度

    【讨论】:

      【解决方案3】:

      如果你嘲笑 SECURE 是什么,那么可以测试这样的东西:

      public static String getSalt(Secure secure, int length) {
              StringBuilder returnValue = new StringBuilder(length);
              for (int i = 0; i < length; i++) {
                  returnValue.append(ALPHABET.charAt(secure.nextInt(ALPHABET.length())));
              }
              return new String(returnValue);
          }
      

      然后:

      @Mock 
      Secure secure;
      
      @Test
      public void testSalt() {
          // arrange
          when(secure.nextInt(any()).thenReturn(0);
      
          // act
          String salted = getSalt(secure, 3);
      
          // assert
          assertEquals(salted, "AAA");
      }
      

      这只是说明static is death to testability 以及遵循良好的 OOP 实践(例如通过构造函数传递依赖项)如何帮助测试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-27
        • 2015-05-22
        • 2016-07-08
        • 2023-04-06
        • 2012-08-16
        • 2013-12-20
        相关资源
        最近更新 更多