前一篇調整 Spring Boot資料庫存取密碼保護後 (https://ithelp.ithome.com.tw/articles/10398877) ,發現以@SpringBootTest為單元測試的程式都會得不到密碼,所以產生錯誤,所以針對單元測試的起動程也需要調整使用PropertySecureProcessInitializer
主要程式工作說明,已於Java Doc方式說明,請參考。
位置:src/test/java/tw/lewishome/webapp/GlobalConstantsTest.java
package tw.lewishome.webapp;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
/**
* GlobalConstantsTest 類別用於測試 GlobalConstants 常數類別的所有常數值。
*
* 此測試類別驗證以下項目:
* <ul>
* <li>GlobalConstants 無法被實例化</li>
* <li>使用者主目錄常數不為空</li>
* <li>預設字符集為 UTF-8</li>
* <li>外部資料夾路徑以 "webappData" 結尾</li>
* <li>上傳路徑包含 "upload" 資料夾</li>
* <li>下載路徑包含 "download" 資料夾</li>
* <li>預設資料夾路徑包含 "default" 資料夾</li>
* <li>系統啟動 UUID 已初始化且不為空</li>
* <li>JWT 密鑰已初始化且不為空</li>
* <li>系統端點列表已初始化</li>
* <li>環境變數映射已初始化</li>
* </ul>
*
* @author lewis
* @version 1.0
* @see GlobalConstants
*/
public class GlobalConstantsTest {
/**
* 測試 GlobalConstants 類別無法被實例化。
*
*/
@Test
public void testCannotInstantiateUtilityClass() {
assertThrows(UnsupportedOperationException.class, GlobalConstants::new);
}
/**
* 測試使用者主目錄常數不為空。
*/
@Test
public void testUserHomeIsNotNull() {
System.out.println("User Home: " + GlobalConstants.USER_HOME);
assertNotNull(GlobalConstants.USER_HOME);
}
/**
* 測試預設字符集為 UTF-8。
*/
@Test
public void testDefaultCharSet() {
System.out.println("Default Char Set: " + GlobalConstants.DEFAULT_CHAR_SET);
assertEquals("UTF-8", GlobalConstants.DEFAULT_CHAR_SET);
}
/**
* 測試外部資料夾路徑以 "webappData" 結尾。
*/
@Test
public void testExternalFolderPath() {
System.out.println("External Folder Path: " + GlobalConstants.EXTERNAL_FOLDER);
assertTrue(GlobalConstants.EXTERNAL_FOLDER.endsWith(GlobalConstants.SEPARATOR + "webappData"));
}
/**
* 測試上傳路徑包含 "upload" 資料夾。
*/
@Test
public void testUploadPathContainsUploadFolder() {
System.out.println("Upload Path: " + GlobalConstants.UPLOAD_PATH);
assertTrue(GlobalConstants.UPLOAD_PATH.contains(GlobalConstants.SEPARATOR + "upload" + GlobalConstants.SEPARATOR));
}
/**
* 測試下載路徑包含 "download" 資料夾。
*/
@Test
public void testDownloadPathContainsDownloadFolder() {
System.out.println("Download Path: " + GlobalConstants.DOWNLOAD_PATH);
assertTrue(GlobalConstants.DOWNLOAD_PATH.contains(GlobalConstants.SEPARATOR + "download" + GlobalConstants.SEPARATOR));
}
/**
* 測試預設資料夾路徑包含 "default" 資料夾。
*/
@Test
public void testDefaultFolderPathContainsDefaultFolder() {
System.out.println("Default Folder Path: " + GlobalConstants.DEFAULT_FOLDER_PATH);
assertTrue(GlobalConstants.DEFAULT_FOLDER_PATH.contains(GlobalConstants.SEPARATOR + "default" + GlobalConstants.SEPARATOR));
}
/**
* 測試系統啟動 UUID 已初始化且不為空。
*/
@Test
public void testSystemBootUuidIsNotEmpty() {
System.out.println("System Boot UUID: " + GlobalConstants.SYSTEM_BOOT_UUID);
assertNotNull(GlobalConstants.SYSTEM_BOOT_UUID);
assertFalse(GlobalConstants.SYSTEM_BOOT_UUID.isEmpty());
assertFalse(GlobalConstants.SYSTEM_BOOT_UUID.contains("-"));
}
/**
* 測試 JWT 密鑰已初始化且不為空。
*/
@Test
public void testJwtSecretIsNotEmpty() {
System.out.println("JWT Secret: " + GlobalConstants.JWT_SECRET);
assertNotNull(GlobalConstants.JWT_SECRET);
assertFalse(GlobalConstants.JWT_SECRET.isEmpty());
}
/**
* 測試系統端點列表已初始化。
*/
@Test
public void testListSystemEndpointIsInitialized() {
System.out.println("List System Endpoint: " + GlobalConstants.LIST_SYSTEM_ENDPOINT);
assertNotNull(GlobalConstants.LIST_SYSTEM_ENDPOINT);
}
/**
* 測試環境變數映射已初始化。
*/
@Test
public void testEnvVarMapIsInitialized() {
GlobalConstants.ENV_VAR.forEach((key, value) ->
System.out.println("Env Var - " + key + ": " + value)
);
System.out.println("Env Var Map: " + GlobalConstants.ENV_VAR);
assertNotNull(GlobalConstants.ENV_VAR);
}
}
位置:src/test/java/tw/lewishome/webapp/GlobalConstantsTest.java
```java`
package tw.lewishome.webapp;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
/**
測試屬性安全處理程序初始化器。
此類實現了 {@link ApplicationContextInitializer} 接口,並用於初始化 Spring 應用程序上下文。
在初始化過程中,它會調用 {@link PropertySecureProcessor} 和 {@link PropertySecureConverter}
的後處理環境方法,以確保環境中的屬性安全處理。
@param applicationContext 可配置的應用程序上下文
@see PropertySecureProcessor
@see PropertySecureConverter
*/
public class TestPropertySecureProcessInitializer implements ApplicationContextInitializer {
@SuppressWarnings("null")
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
ConfigurableEnvironment environment = applicationContext.getEnvironment();
new PropertySecureProcessor().postProcessEnvironment(environment, null);
new PropertySecureConverter().postProcessEnvironment(environment, null);
}
}
### 三、調整 WebappApplicationTests 系統測試啟動程式
```java`
package tw.lewishome.webapp;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
/**
* WebappApplicationTests 是一個測試類別,用於測試 Spring Boot 應用程序的上下文加載。
*
* <p>此類別使用 {@link SpringBootTest} 註解來啟動整個應用程序上下文,並使用
* {@link ContextConfiguration} 註解來指定初始化器 {@link TestPropertySecureProcessInitializer}。</p>
*
* <p>測試方法 {@link #contextLoads()} 用於驗證應用程序上下文是否能夠成功加載。</p>
*/
@SpringBootTest
@ContextConfiguration(initializers = TestPropertySecureProcessInitializer.class)
class WebappApplicationTests {
@Test
void contextLoads() {
}
}

iThome鐵人賽