public static String generateSaltString() {
SecureRandom random = new SecureRandom();
byte[] salt = random.generateSeed(12);
return byteToBase64(salt);
}
想知道如何使用Junit为此方法编写测试用例。 有什么建议吗?
答案 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)
我可以想到两个测试用例 -
答案 3 :(得分:0)
你可以查看3件事:
Base64
字符串)例如,以下代码可以正常工作。我生成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);
}