У меня есть класс со статическим методом для шифрования и дешифрования. Я пишу тест для этих методов, но я получаю java.lang.IllegalStateException с не инициализированным сообщением.Ошибка инициализации при вызове статического метода в модульном тесте
public final class CipherUtil {
private static Logger log = Logger.getLogger(CipherUtil.class);
private static final String SECRET_KEY = "XXX";
private static Cipher cipher;
private static SecretKeySpec secretKeySpec;
static{
try {
cipher = Cipher.getInstance("AES");
} catch (NoSuchAlgorithmException | NoSuchPaddingException ex) {
log.error(ex);
}
byte[] key = null;
try {
key = Hex.decodeHex(SECRET_KEY.toCharArray());
} catch (DecoderException ex) {
log.error(ex);
}
secretKeySpec = new SecretKeySpec(key, "AES");
}
private CipherUtil() { }
public static String encrypt(String plainText) {
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
...
}
public static String decrypt(String encryptedText) {
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
...
}
}
испытаний Класс
@Test
public void testEncryptDecrypt() {
String plainText = "Secret Message";
String encryptedText = CipherUtil.encrypt(plainText);
assertThat(encryptedText, not(equalTo(plainText)));
String decryptedText = CipherUtil.decrypt(encryptedText);
assertThat(decryptedText, is(equalTo(plainText)));
assertThat(encryptedText, not(equalTo(decryptedText)));
}
Исключение
java.lang.IllegalStateException: Cipher not initialized
Не делайте этого со статикой и не делайте класс окончательным. Это сделает невозможным издевательство над этим объектом, когда классы тестирования модулей, которые сотрудничают с ним. –
Проблема не в статике, вам просто нужно вызвать init на вашем шифре: http://docs.oracle.com/javase/7/docs/api/javax/crypto/Cipher.html – Renato
@ Renato У меня есть init call.See обновленный код вопроса –