[英]Junit test case
public static String generateSaltString() {
SecureRandom random = new SecureRandom();
byte[] salt = random.generateSeed(12);
return byteToBase64(salt);
}
想知道如何使用Junit為此方法編寫測試用例。 有什么建議嗎?
首先,新的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代碼分離。
希望它有所幫助。
我將測試結果是否為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件事:
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.