介面3

一曲微茫發表於2024-11-11

當然可以,編寫單元測試可以幫助驗證 IpAddressService 介面的實現是否按預期工作。我們將使用 JUnit 和 Mockito 來編寫單元測試。以下是一個示例單元測試類:

單元測試類

package com.example.service.impl;

import com.example.entity.AllIpAddressCheckRequest;
import com.example.entity.AllIpAddressCheckResponse;
import com.example.exception.TitanException;
import com.example.service.IpAddressService;
import com.example.service.IpCheckService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.*;

class IpAddressServiceImplTest {

    @Mock
    private IpCheckService ipCheckService;

    @InjectMocks
    private IpAddressService ipAddressService = new IpAddressServiceImpl();

    @BeforeEach
    void setUp() {
        MockitoAnnotations.openMocks(this);
    }

    @Test
    void testAllIpAddressCheckWithValidIps() throws InterruptedException {
        // 準備測試資料
        AllIpAddressCheckRequest request = new AllIpAddressCheckRequest();
        request.setIpAddressList(Arrays.asList("192.168.1.1", "10.0.0.1"));

        // 模擬非同步 IP 檢查方法的行為
        when(ipCheckService.asyncIpCheck(anyString(), anyMap(), any(CountDownLatch.class))).thenAnswer(invocation -> {
            String ipAddress = invocation.getArgument(0);
            Map<String, Boolean> map = invocation.getArgument(1);
            CountDownLatch latch = invocation.getArgument(2);
            map.put(ipAddress, true);
            latch.countDown();
            return null;
        });

        // 執行測試
        AllIpAddressCheckResponse response = ipAddressService.allIpAddressCheck(request);

        // 驗證結果
        assertTrue(response.getResult());
        assertEquals(2, response.getMap().size());
        assertTrue(response.getMap().get("192.168.1.1"));
        assertTrue(response.getMap().get("10.0.0.1"));
    }

    @Test
    void testAllIpAddressCheckWithInvalidIps() {
        // 準備測試資料
        AllIpAddressCheckRequest request = new AllIpAddressCheckRequest();
        request.setIpAddressList(Arrays.asList("192.168.1.1", "invalid-ip"));

        // 模擬非同步 IP 檢查方法的行為
        when(ipCheckService.asyncIpCheck(anyString(), anyMap(), any(CountDownLatch.class))).thenAnswer(invocation -> {
            String ipAddress = invocation.getArgument(0);
            Map<String, Boolean> map = invocation.getArgument(1);
            CountDownLatch latch = invocation.getArgument(2);
            if (ipAddress.equals("192.168.1.1")) {
                map.put(ipAddress, true);
            } else {
                map.put(ipAddress, false);
            }
            latch.countDown();
            return null;
        });

        // 執行測試
        assertThrows(TitanException.class, () -> ipAddressService.allIpAddressCheck(request));
    }

    @Test
    void testAllIpAddressCheckWithEmptyRequest() {
        // 準備測試資料
        AllIpAddressCheckRequest request = new AllIpAddressCheckRequest();

        // 執行測試
        assertThrows(TitanException.class, () -> ipAddressService.allIpAddressCheck(request));
    }

    @Test
    void testAllIpAddressCheckWithNullRequest() {
        // 執行測試
        assertThrows(TitanException.class, () -> ipAddressService.allIpAddressCheck(null));
    }

    @Test
    void testAllIpAddressCheckWithEmptyIpList() {
        // 準備測試資料
        AllIpAddressCheckRequest request = new AllIpAddressCheckRequest();
        request.setIpAddressList(new ArrayList<>());

        // 執行測試
        assertThrows(TitanException.class, () -> ipAddressService.allIpAddressCheck(request));
    }

    @Test
    void testAllIpAddressCheckWithInvalidIpFormat() {
        // 準備測試資料
        AllIpAddressCheckRequest request = new AllIpAddressCheckRequest();
        request.setIpAddressList(Arrays.asList("192.168.1.1", "256.0.0.1"));

        // 執行測試
        assertThrows(TitanException.class, () -> ipAddressService.allIpAddressCheck(request));
    }
}

解釋

  1. 匯入必要的庫

    • 匯入 JUnit 和 Mockito 相關的庫。
  2. 設定測試類

    • 使用 @Mock 註解來建立 IpCheckService 的模擬物件。
    • 使用 @InjectMocks 註解來建立 IpAddressService 的例項,並注入模擬物件。
    • 使用 @BeforeEach 註解來初始化 Mockito。
  3. 測試方法

    • testAllIpAddressCheckWithValidIps:測試所有 IP 地址都是有效的場景。

      • 準備測試資料。
      • 模擬 asyncIpCheck 方法的行為,使其返回正確的結果。
      • 執行 allIpAddressCheck 方法並驗證結果。
    • testAllIpAddressCheckWithInvalidIps:測試包含無效 IP 地址的場景。

      • 準備測試資料。
      • 模擬 asyncIpCheck 方法的行為,使其返回部分無效的結果。
      • 驗證方法是否丟擲 TitanException 異常。
    • testAllIpAddressCheckWithEmptyRequest:測試請求物件為空的場景。

      • 準備測試資料。
      • 驗證方法是否丟擲 TitanException 異常。
    • testAllIpAddressCheckWithNullRequest:測試請求物件為 null 的場景。

      • 驗證方法是否丟擲 TitanException 異常。
    • testAllIpAddressCheckWithEmptyIpList:測試 IP 地址列表為空的場景。

      • 準備測試資料。
      • 驗證方法是否丟擲 TitanException 異常。
    • testAllIpAddressCheckWithInvalidIpFormat:測試包含格式錯誤的 IP 地址的場景。

      • 準備測試資料。
      • 驗證方法是否丟擲 TitanException 異常。

透過這些測試用例,可以全面驗證 IpAddressService 的功能和異常處理情況。希望這對你有幫助!如果有任何進一步的問題或需要更多的調整,請隨時告訴我。

相關文章