0

Я занимаюсь интернатурой для компании безопасности webapp, и одна из моих задач - писать модульные тесты для файлов. Файл, над которым я сейчас работаю, просто возвращает шифрованный шифр на основе пароля. Способ, которым я хочу протестировать файл, - это шифрование и расшифровка шифров, основанных на одном и том же пароле. Затем я хочу зашифровать, а затем расшифровать строку и сравнить ее с исходной строкой. Тест проходит, если две строки равны.Написание параметризованных тестов для JUnit, почему два из моих параметров «null» при выполнении моих тестов?

С этой целью я сделал параметризованный тестовый класс JUnit с 4-мя полями: один для имени моего теста, один для данных, которые я запускаю через процессы шифрования/дешифрования, один для шифрования и один для шифрования дешифрования. Я инициализирую свои шифры в моем методе setUp, прежде чем передавать их в мой метод @Parameters.

Однако, когда я запускаю свои тесты, я продолжаю работать в NullPointerException. С помощью представления Debug в Eclipse я определил, что по какой-то причине, хотя все параметры заданы правильно в методе data(), когда пришло время запустить мой фактический метод testMethod(), поля и _data верны, но полями _encryptCipher и _decryptCipher являются null. Почему это?

@RunWith(Parameterized.class) 
public class TestClass { 
    String _name; 
    byte[] _data; 
    Cipher _encryptCipher; 
    Cipher _decryptCipher; 

    public TestClass(String _name, byte[] _data, Cipher _encryptCipher, Cipher _decryptCipher) { 
     this._name = _name; 
     this._data = _data; 
     this._encryptCipher = _encryptCipher; 
     this._decryptCipher = _decryptCipher; 
    } 

    static CryptoManager cm; 
    static Cipher SIMPLEPASS_ENCRYPT_CIPHER; 
    static Cipher SIMPLEPASS_DECRYPT_CIPHER; 

    private static final byte[] TEST_SALT = "!th1s_i.s_an 3x4mp+le &s4lt  4_t%35t1ng".getBytes(); 

    @BeforeClass 
    public static void setUp() throws Exception { 
     cm = CryptoManager.getInstance(); 
     cm.initPsc(); 

     SIMPLEPASS_ENCRYPT_CIPHER = CipherUtils.getPBECipher("abc123".toCharArray(), TEST_SALT, Cipher.ENCRYPT_MODE); 
     SIMPLEPASS_DECRYPT_CIPHER = CipherUtils.getPBECipher("abc123".toCharArray(), TEST_SALT, Cipher.DECRYPT_MODE); 
    } 

    @Parameters(name = "{index}: {0}") 
    public static Collection<Object[]> data() { 
     return Arrays.asList(new Object[][] { 
      {"Test 1", "545671260887".getBytes(), SIMPLEPASS_ENCRYPT_CIPHER, SIMPLEPASS_DECRYPT_CIPHER} 
     }); 
    } 

    @Test 
    public void testMethod() throws Exception { 
     assertEquals(_name, _data,  _decryptCipher.doFinal(_encryptCipher.doFinal(_data))); 
    } 

    @AfterClass 
    public static void tearDown() throws Exception { 
     cm.shutdown(); 
    } 
} 

ответ

2

data() Метод вызывается перед setUp(). Поэтому SIMPLEPASS_ENCRYPT_CIPHER и SIMPLEPASS_DECRYPT_CIPHER являются нулевыми.

Вы можете создать Шифры непосредственно:

private static final Cipher SIMPLEPASS_ENCRYPT_CIPHER = CipherUtils.getPBECipher("abc123".toCharArray(), TEST_SALT, Cipher.ENCRYPT_MODE); 

или жгутов в data() метод:

@Parameters(name = "{index}: {0}") 
public static Collection<Object[]> data() { 
    SIMPLEPASS_ENCRYPT_CIPHER = CipherUtils.getPBECipher("abc123".toCharArray(), TEST_SALT, Cipher.ENCRYPT_MODE); 
    SIMPLEPASS_DECRYPT_CIPHER = CipherUtils.getPBECipher("abc123".toCharArray(), TEST_SALT, Cipher.DECRYPT_MODE); 

    return Arrays.asList(new Object[][] { 
    {"Test 1", "545671260887".getBytes(), SIMPLEPASS_ENCRYPT_CIPHER, SIMPLEPASS_DECRYPT_CIPHER} 
    }); 
} 
Смежные вопросы