【问题标题】:Writing parameterized tests for JUnit, why are two of my parameters "null" when I run my tests?为 JUnit 编写参数化测试,为什么我的两个参数在运行测试时为“空”?
【发布时间】:2013-08-09 15:57:14
【问题描述】:

我正在一家 webapp 安全公司实习,我的任务之一是为文件编写单元测试。我现在正在处理的文件只是返回一个基于密码的加密密码。我想测试文件的方法是制作基于相同密码的加密和解密密码。然后,我想加密然后解密一个字符串,并将其与原始字符串进行比较。如果两个字符串相等,则测试通过。

为此,我创建了一个带有 4 个字段的参数化 JUnit 测试类:一个用于我的测试名称,一个用于我正在通过加密/解密过程运行的数据,一个用于加密密码,一个用于解密密码。在将密码传递给我的@Parameters 方法之前,我在我的 setUp 方法中初始化了我的密码。

但是,当我运行测试时,我总是遇到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();
    }
}

【问题讨论】:

    标签: unit-testing parameters junit nullpointerexception encryption


    【解决方案1】:

    方法data()setUp()之前被调用。因此SIMPLEPASS_ENCRYPT_CIPHERSIMPLEPASS_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}
      });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多