2014-09-30 4 views
0

У меня есть класс со статическим методом для шифрования и дешифрования. Я пишу тест для этих методов, но я получаю 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 
+2

Не делайте этого со статикой и не делайте класс окончательным. Это сделает невозможным издевательство над этим объектом, когда классы тестирования модулей, которые сотрудничают с ним. –

+0

Проблема не в статике, вам просто нужно вызвать init на вашем шифре: http://docs.oracle.com/javase/7/docs/api/javax/crypto/Cipher.html – Renato

+0

@ Renato У меня есть init call.See обновленный код вопроса –

ответ

0

Вопрос заключается в том, что вы не можете инициализировать объект дважды. Вам понадобится один статический экземпляр для режима дешифрования, один для режима шифрования и один для любого другого режима, который вы хотите использовать. Вам нужно будет переместить вызов init из метода в статический конструктор (хотя я согласен с Инженерной Долейкой, что это не должно быть статичным).

Смежные вопросы