簡體   English   中英

如何驗證調用是在我的方法中的特定列表上進行的?

[英]How do I verify a call is made on a specific list in my method?

如果我有以下代碼:

public void process(List<String> messages){
    
    Map<String, List<String>> mapofLists = new HashMap<>();
    List<String> list1 = new ArrayList();
    List<String> list2 = new ArrayList();
    List<String> list3 = new ArrayList();    

    for (String message : messages) {
        if(message.contains("123")){
            list.add(message);
        }
        else if(message.contains("456")) {
            list2.add(message);
        }
        else {
            list3.add(message);
        }
    }

    mapofLists.put("123",list1);
    mapofLists.put("345",list2);
    mapofLists.put("678",list3);

    service.makeApiCall(mapofLists);

}

我知道如何在最后驗證 api 調用。 但是我對如何編寫測試以確保每個列表(list1、list2、list3)根據傳入的消息列表添加了正確數量的消息感到困惑。我該怎么做?

據我所知,Mockito 不允許您公開和模擬這樣的方法的內部結構。 如果您將mapOfLists或單個列表傳遞給process方法,您將能夠使用與驗證對服務方法的調用相同或相似的方法相當容易地做到這一點; 但是,對於這種方法沒有多大意義,因為用戶需要事先創建每個值,並且如果您決定更改所需的列表數量,那將很麻煩。

可能最好的方法是將 api 調用移出process方法,並返回mapOfLists稍后使用服務發送。 您可以在 map 上使用各種斷言來確保發送正確的數據。

這也將允許您將這兩個操作解耦,以便處理和發送真正成為 2 個獨立的操作,而不是 1 個,從而使您的代碼更易於維護和閱讀。

public class Processor {
    public static Map<String, List<String>> processor(List<String> message) {
        Map<String, List<String>> mapOfLists = new HashMap<>();

        List<String> list1 = new ArrayList();
        List<String> list2 = new ArrayList();
        List<String> list3 = new ArrayList();    

        for (String message : messages) {
            if(message.contains("123")) {
                list.add(message);
            } else if(message.contains("456")) {
                list2.add(message);
            } else {
                list3.add(message);
            }
        }

        mapOfLists.put("123",list1);
        mapOfLists.put("345",list2);
        mapOfLists.put("678",list3);

        return mapOfLists;
    }
}

並在您的測試文件中

public class TestProcessing {
    @Test
    public void testEmpty() {
        List<String> messages = new ArrayList<>();

        Map<String, List<String>> expected = new HashMap<>();
        expected.put("123", new ArrayList<>();
        expected.put("345", new ArrayList<>();
        expected.put("678", new ArrayList<>();

        assertEquals(Processor.process(messages), expected);
    }
}

您可以使用ArgumentCaptor攔截 API 調用的參數,然后根據需要驗證列表中適當數量的消息和/或 map 的全部內容、其鍵集和值。

示例測試可能如下所示(未測試):

@Mock
ApiService service; // mock makeApiCall

@InjectMocks
ProcessService processService; // implements process(List<String messages>)

@Test
void processOk() {
    ArgumentCaptor<Map<String, List<String>>> captor = ArgumentCaptor.forClass(Map.class);

    doNothing().when(service).makeApiCall(any());

    processService.process(List.of("123", "456_1", "456_2", "Test"));
    verify(service, times(1)).makeApiCall(captor.capture());

    Map<String, List<String>> map = captor.getValue();
    
    assertEquals(3, map.size());
    assertEquals(1, map.get("123"));
    assertEquals(2, map.get("345"));
    assertEquals(1, map.get("678"));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM