我正在使用JUnit 4 [C:\ eclipse \ plugins \ org.junit_4.11.0.v201303080030 \ junit.jar]与Eclipse结合使用(MARS,版本:Mars Milestone 3(4.5.0M3)Build id :20141113-0320。
我有一些测试可以测试一个简单的类,哪些测试运行良好。但现在到了我想测试我的加密类的地步,它实现了以下加密功能:
public String encrypt(String data) {
try {
SecretKeySpec KS = new SecretKeySpec(mKeyData, "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish/CBC/ZeroBytePadding"); // PKCS5Padding
cipher.init(Cipher.ENCRYPT_MODE, KS, new IvParameterSpec(mIv));
return bytesToHex(cipher.doFinal(data.getBytes()));
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (InvalidAlgorithmParameterException e) {
e.printStackTrace();
}
return null;
}
Crypto类不属于分类......
public class Crypto {
为了测试这个类以及更多的加密函数,我设计了以下单元测试:
package my.junit4.example;
import static org.junit.Assert.*;
import org.junit.Test;
public class CryptoTest {
@Test
public void testEncryption() {
Crypto myCrypto = new Crypto();
String encodedString = myCrypto.encrypt("Secret");
assertTrue("The decrypted encrypted word should deliver the original string", encodedString.equals(myCrypto.decrypt(encodedString)));
}
}
此测试失败并显示堆栈跟踪:
java.security.NoSuchAlgorithmException: Cannot find any provider supporting Blowfish/CBC/ZeroBytePaddingnull
at javax.crypto.Cipher.getInstance(Cipher.java:535) at
my.junit.example.encrypt(Crypto.java:35) at
my.junit.example.CryptoTest.testEncrypt(CryptoTest.java:14) at
这对我来说没什么意义。但对JUnit来说相对较新我怀疑问题在于我不了解如何制定这些测试。代码运行良好加密 - 我的调试器中的解密给了我想要的结果。但是我如何才能使用JUnit。我犯了什么明显的错误?
答案 0 :(得分:2)
您需要将Bouncy Castle提供程序添加到Java运行时。您可以通过查看Bouncy Castle wiki page了解如何安装提供程序。 Java安装不支持Blowfish算法和零填充。
我的包装箱上运行正常:
Security.addProvider(new BouncyCastleProvider());
byte[] mKeyData = new byte[16];
byte[] mIv = new byte[8];
SecretKeySpec KS = new SecretKeySpec(mKeyData, "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish/CBC/ZeroBytePadding");
cipher.init(Cipher.ENCRYPT_MODE, KS, new IvParameterSpec(mIv));
确保运行时测试框架也可以使用提供程序。在安装提供程序之前,您需要将bcprov-jdk15on-[version].jar
放在运行时的类路径中。
答案 1 :(得分:1)
问题在于这一行:
Cipher cipher = Cipher.getInstance("Blowfish/CBC/ZeroBytePadding");
您的系统不支持您请求的算法。您想要特定原因的任何特殊原因吗?
The docs指定以下默认实现: