You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:05:10