我正在为一家webapp安全公司做实习,我的任务之一就是为文件编写单元测试。我正在处理的文件现在只返回一个基于密码的加密密码。我想测试文件的方法是使用基于相同密码的加密和解密密码。然后,我想加密然后解密一个字符串,并将其与原始字符串进行比较。如果两个字符串相等,则测试通过。
为此,我创建了一个带有4个字段的参数化JUnit测试类:一个用于我的测试名称,一个用于我通过加密/解密过程运行的数据,一个用于加密密码,一个用于加密密码解密密码。我在我的setUp方法中初始化我的密码,然后将它们传递给我的@Parameters
方法。
但是,当我运行测试时,我一直遇到NullPointerException
。在Eclipse的Debug视图的帮助下,我已经确定,出于某种原因,虽然在data()
方法中正确设置了所有参数,但是到了运行我的实际testMethod()
方法的时候,我的_name
和_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();
}
}
答案 0 :(得分: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}
});
}