public static String generateSaltString() {
    SecureRandom random = new SecureRandom();
    byte[] salt = random.generateSeed(12);

    return byteToBase64(salt);
}

想知道如何使用Junit为此方法编写测试用例。 有什么建议吗?

===============>>#1 票数:3

首先,新的SecureRandom()可能非常慢,因此您可能希望对其进行缓存。 看看这个答案, 一个了。

我会按如下方式重构你的代码

public class DoRandomStuff {

private RandomUtil randomUtil;

public DoRandomStuff(RandomUtil randomUtil) {
    this.randomUtil = randomUtil;
}

public String generateSaltString() {
    byte[] salt = randomUtil.generateSeed(12);
    return byteToBase64(salt);
}

public String byteToBase64(byte[] salt) {
    // Do salt generation logic here
    return null;
}

generateSeed看起来像一个实用程序方法调用,因此它可以进入类似于此的RandomUtil类

class RandomUtil {
    private SecureRandom random = new SecureRandom();
    public byte[] generateSeed(int seed) {
        return random.generateSeed(seed);
    }
}

现在,您的DoRandomStuff测试类很容易编写。 使用像Mockito这样的测试框架注入一个模拟的randomUtil。 使mockedRandomUtil.generateSeed(int)方法返回固定数字。 您的测试实际上是用于检查byteToBase64()方法是否正在执行它应该执行的操作。 现在,您的测试用例有一个确定的数字。 您可以将测试类中SecureRandom生成的各种数字作为单独的测试用例来检查byteToBase64()结果。 作为一个加号,您的随机数生成代码现在与您的base64代码分离。

希望它有所帮助。

===============>>#2 票数:1

我将测试结果是否为null然后多次调用该方法并比较结果以显示每个调用返回不同的值。

但请记住:这没有说明结果随机性的质量!

@Test
public void testGenerateSaltString() {
    String salt1 = YourClass.generateSaltString();
    String salt2 = YourClass.generateSaltString();
    String salt3 = YourClass.generateSaltString();
    String salt4 = YourClass.generateSaltString();

    assertNotNull(salt1);
    assertNotNull(salt2);
    assertNotNull(salt3);
    assertNotNull(salt4);

    assertNotEqual(salt1, salt2);
    assertNotEqual(salt1, salt3);
    assertNotEqual(salt1, salt4);

    assertNotEqual(salt2, salt3);
    assertNotEqual(salt2, salt4);

    assertNotEqual(salt3, salt4);
}

考虑到GaborSch的注释,我想到了测试的一些模糊实现,因为它可能 - 尽管不太可能 - 两次调用函数将产生相同的盐:

@Test
public void testGenerateSaltString() {
    String salt1;
    String salt2;
    int differenceCount = 0;

    for(int i = 0; i < 1000; i++ ) {
        String salt1 = YourClass.generateSaltString();
        String salt2 = YourClass.generateSaltString();

        // null is still inacceptable
        assertNotNull(salt1);
        assertNotNull(salt2);

        if(!salt1.equalsIgnoreCase(salt2)) {
            differenceCount++;
        }
    }

    // check if at least at 95% of all tries resultet in different strings
    // change this value according to your needs
    assertTrue(differenceCount >= 950);
}

===============>>#3 票数:0

我可以想到两个测试用例 -

  • 检查返回值是否为空。
  • 如果您希望它返回base64,请检查返回是否为base64。 虽然你期待任何随机字符串并不重要。

===============>>#4 票数:0

你可以检查3件事:

  1. 如果结果为null或不为null
  2. 如果结果符合形式要求(是Base64字符串)
  3. 如果结果足够随机

例如,以下代码可以工作。 我生成100种不同的随机盐,并允许它们之间最多匹配1个。

@Test
public void testGenerateSaltString() {

    Set<String> salts = new HashSet<String>();
    int countSame = 0;
    BASE64Decoder decoder = new BASE64Decoder();

    for(int i=0; i<100; i++) {
        String salt = YourClass.generateSaltString();
        assertNotNull(salt);
        try {
            decoder.decodeBuffer(encodedBytes);
       } catch (Exception e) {
           fail("Not Base64");
       }
       if (salts.contains(salt)) {
            sameCount++;
       }
       salts.add(salt);
    }

    assertTrue(countSame <= 1);
}

  ask by johnnily translate from so

未解决问题?本站智能推荐: