Junit测试用例

时间:2013-04-16 02:50:59

标签: java junit salt

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

    return byteToBase64(salt);
}

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

4 个答案:

答案 0 :(得分:3)

首先,新的SecureRandom()可能非常慢,因此您可能希望对其进行缓存。 请看this回答和this回答。

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

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代码分离。

希望它有所帮助。

答案 1 :(得分: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);
}

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

你可以查看3件事:

  1. 如果结果为null或不是
  2. 如果结果符合形式要求(是Base64字符串)
  3. 如果结果足够随机
  4. 例如,以下代码可以正常工作。我生成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);
    }