iT邦幫忙

0

Spring Boot資料庫存取密碼保護 (補充 @SpringTest Not Work)

  • 分享至 

  • xImage
  •  

Spring Boot 單元測試時資料庫存取密碼解密

概述

前一篇調整 Spring Boot資料庫存取密碼保護後 (https://ithelp.ithome.com.tw/articles/10398877) ,發現以@SpringBootTest為單元測試的程式都會得不到密碼,所以產生錯誤,所以針對單元測試的起動程也需要調整使用PropertySecureProcessInitializer

主要程式工作說明,已於Java Doc方式說明,請參考。

一、調整 GlobalConstantsTest 系統測試用基礎常數定義

位置: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);
    }
}

二、調整 TestPropertySecureProcessInitializer 系統測試用Property處理

位置: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() {
	}

}

測試結過

https://ithelp.ithome.com.tw/upload/images/20251223/20139477r0lZGBRyb3.png


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言