Keystore获取PrivateKey返回null问题排查求助
问题原因及解决办法
核心原因
你用Mockito创建了KeyStore的mock对象,但没有为getKey()方法设置存根(Stub)。Mockito对mock对象的未存根方法调用,默认返回null,所以getPrivateKey()方法最终返回null。
另外你的测试方法命名为getPrivateKey_ExceptionTest,但当前代码既没有触发异常,也没有验证异常逻辑,这也是测试的疏漏。
解决办法
根据你的测试目标,分两种场景调整测试代码:
场景1:测试正常获取私钥的逻辑
为keystore.getKey()方法设置返回一个模拟的PrivateKey对象:
@Test public void getPrivateKey_SuccessTest() throws Exception { // 1. 创建mock对象 KeyStore keystoreMock = Mockito.mock(KeyStore.class); PrivateKey mockPrivateKey = Mockito.mock(PrivateKey.class); // 2. 存根getKey方法,指定返回值 char[] pwd = {'c', 'h', 'a', 'n', 'g', 'e', 'i', 't'}; Mockito.when(keystoreMock.getKey("somestring", pwd)).thenReturn(mockPrivateKey); // 3. 调用方法并验证结果 PrivateKey result = cryptoUtils.getPrivateKey(keystoreMock, "somestring", pwd); Assertions.assertNotNull(result); Assertions.assertEquals(mockPrivateKey, result); }
场景2:测试异常抛出逻辑(对应你的方法名)
存根getKey()方法让它抛出指定异常,然后验证是否正确封装为BenefitsException:
@Test public void getPrivateKey_ExceptionTest() throws Exception { // 1. 创建mock对象 KeyStore keystoreMock = Mockito.mock(KeyStore.class); char[] pwd = {'c', 'h', 'a', 'n', 'g', 'e', 'i', 't'}; // 2. 存根getKey方法,让它抛出异常 Mockito.when(keystoreMock.getKey("somestring", pwd)) .thenThrow(new UnrecoverableKeyException("Test exception")); // 3. 验证是否抛出预期异常 BenefitsException exception = Assertions.assertThrows(BenefitsException.class, () -> cryptoUtils.getPrivateKey(keystoreMock, "somestring", pwd)); Assertions.assertTrue(exception.getMessage().contains("Error in getPrivateKey method")); Assertions.assertInstanceOf(UnrecoverableKeyException.class, exception.getCause()); }
额外说明
你当前测试中通过FieldUtils修改keyStoreSpi和initialized字段的操作是多余的——Mockito创建的mock对象不需要手动初始化这些内部字段,直接存根目标方法即可。
内容的提问来源于stack exchange,提问作者shaik-ameen104
相关产品推荐
相关产品推荐

