test ssl java
// 文件名:SslUtilsTest.java// 包路径:
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import java.io.InputStream;
import java.security.KeyStore;
import javax.net.ssl.SSLContext;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.eNodeCache;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockedStatic;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.client.ClientHttpRequestFactory;
@RunWith(PowerMockRunner.class)
@PrepareForTest({SslUtils.class, CacheHelper.class, LoggerFactory.class})
public class SslUtilsTest {
private static final String TEST_KEYSTORE_PATH = "test-keystore.jks";
private static final String STORE_PASSWORD = "storepass";
private static final String KEY_PASSWORD = "keypass";
private Cache<String, KeyStore> mockCache;
private Logger mockLogger;
@Before
public void setUp() throws Exception {
// 模拟 Logger 和 Cache 依赖
mockLogger = mock(Logger.class);
mockCache = mock(Cache.class);
PowerMockito.mockStatic(LoggerFactory.class);
when(LoggerFactory.getLogger(SslUtils.class)).thenReturn(mockLogger);
PowerMockito.mockStatic(CacheHelper.class);
when(CacheHelper.getInstance().getTamKeyStoreCache()).thenReturn(mockCache);
}
@Test
public void testGetClientHttpRequestFactory_LoadKeyStoreFromCache() throws Exception {
// 模拟缓存中存在 KeyStore
KeyStore mockKeyStore = mock(KeyStore.class);
when(mockCache.containsKey(CacheConstants.ECAGHE_IAW_KEYSTORE)).thenReturn(true);
when(mockCache.get(CacheConstants.ECAGHE_IAW_KEYSTORE)).thenReturn(mockKeyStore);
// 调用方法
ClientHttpRequestFactory factory = SslUtils.getClientHttpRequestFactory(
TEST_KEYSTORE_PATH, STORE_PASSWORD, KEY_PASSWORD
);
// 验证结果
assertNotNull(factory);
verify(mockLogger).info("***** 密钥库已从缓存加载 *****");
}
@Test
public void testGetClientHttpRequestFactory_LoadKeyStoreFromFile() throws Exception {
// 模拟缓存中无 KeyStore,触发文件加载
when(mockCache.containsKey(CacheConstants.ECAGHE_IAW_KEYSTORE)).thenReturn(false);
// 使用真实测试密钥库文件(需提前放置在 test/resources 目录)
KeyStore keyStore = KeyStore.getInstance("JKS");
try (InputStream is = getClass().getClassLoader().getResourceAsStream(TEST_KEYSTORE_PATH)) {
keyStore.load(is, STORE_PASSWORD.toCharArray());
}
// 调用方法
ClientHttpRequestFactory factory = SslUtils.getClientHttpRequestFactory(
TEST_KEYSTORE_PATH, STORE_PASSWORD, KEY_PASSWORD
);
// 验证结果
assertNotNull(factory);
verify(mockCache).put(CacheConstants.ECAGHE_IAW_KEYSTORE, keyStore);
verify(mockLogger).info("密钥库从文件加载: {}", anyString());
}
@Test
public void testGetClientHttpRequestFactory_InvalidKeystorePath() {
// 模拟无效路径
ClientHttpRequestFactory factory = SslUtils.getClientHttpRequestFactory(
"invalid-path.jks", STORE_PASSWORD, KEY_PASSWORD
);
// 验证错误日志
verify(mockLogger).error("密钥库文件路径无效: {}", "invalid-path.jks");
assertNotNull(factory); // 工厂可能仍被创建(需根据实际逻辑调整)
}
@Test
public void testLoadKeyStore_WithEmptyPassword() throws Exception {
// 测试空密码场景
try (MockedStatic<SSLContexts> sslContextsMock = Mockito.mockStatic(SSLContexts.class)) {
sslContextsMock.when(() -> SSLContexts.custom().loadKeyMaterial(any(), any()))
.thenThrow(new IllegalArgumentException("密码错误"));
ClientHttpRequestFactory factory = SslUtils.getClientHttpRequestFactory(
TEST_KEYSTORE_PATH, "", ""
);
verify(mockLogger).error("SSL 配置失败: {}", "密码错误");
}
}
}