簡體   English   中英

創建一個包含對象的模擬列表

[英]Create a mocked list with objects

我想用測試模擬對象創建一個 JUnit 測試:

public class BinCountryCheckFilterImplTest {

    private RiskFilterService riskFilterService = null;

    @Before
    public void beforeEachTest() {

        List<RiskFilters> list = new ArrayList<RiskFilters>();

        riskFilterService = Mockito.mock(RiskFilterService.class);

        // put here list of List<RiskFilters> and return it 
    }

    @Test
    public void testBinCountryCheckFilterImpl() {

        List<RiskFilters> filter_list = riskFilterService.findRiskFiltersByTerminalIdAndType(11, "test");
         // do something                
    }    
}

調用RiskFilterService時如何返回列表List<RiskFilters>

第二次嘗試:

public class BinCountryCheckFilterImplTest {

    private RiskFilterService riskFilterService = null;

    @Mock
    List<RiskFilters> mockList = new ArrayList<RiskFilters>();

    @BeforeClass
    public void beforeEachTest() {

        //if we don't call below, we will get NullPointerException
        MockitoAnnotations.initMocks(this);

        mockList.add(new RiskFilters());

        riskFilterService = Mockito.mock(RiskFilterService.class);
    }

    @Test
    public void testBinCountryCheckFilterImpl() {

        when(riskFilterService.findRiskFiltersByTerminalIdAndType(anyInt(), anyString())).thenReturn(mockList);

        List<RiskFilters> filter_list = riskFilterService.findRiskFiltersByTerminalIdAndType(11, "BinCountryCheckFilter");

    }
}

但我得到riskFilterService的 NPE。 看起來帶有注釋@test的方法在@BeforeClass之前被調用。

好吧,您提供的信息非常少。 但是讓我通過

你必須有BinCountryCheckFilter class。 請在您的測試 class 中初始化它並添加注釋@InjectMocks

@InjectMock
private BinCountryCheckFilter binCountryCheckFilter;

riskFilterService = Mockito.mock(RiskFilterService.class); @BeforeClass中取出並公開。

但這只會模擬您的 class 並且不會測試任何內容。 您可以測試的一件事是沒有撥打電話。 見下文

verify(mockList, times(1)).yourMethodName(); 

或在您的測試或方法之前添加以下內容

when(riskFilterService.yurMethodName).thenReturn(your Return value);

這樣你就可以模擬你想要的數據。 讓我知道是否需要任何其他澄清。

我不確定您的 JUnit 版本,但您可以刪除

立即從您的代碼中獲取@BeforeClass

 @Mock
    List<RiskFilters> mockList = new ArrayList<RiskFilters>();

也。

當單元測試中需要 List 或任何其他 Collection 時,要問自己的第一個問題是:我應該為它創建一個 mock,還是應該創建一個包含 mock 的 List 或 Collection。

當被測試的邏輯不使用列表,而只是傳遞列表而不是你可以模擬它時。

否則,最好不要模擬 List 或 Collection,而是創建一個包含模擬對象的普通列表,因為很難知道 List 或 Collections 的哪些方法需要存根。 使用 for 循環迭代項目時調用哪些方法,在它們上使用迭代器時,在它們上使用 stream 時,...? 在編寫單元測試時,我經常使用帶有模擬參數的 Collections.singletonList 或 Arrays.asList 來初始化列表。

我看到您模擬了列表,然后在設置測試時調用 add 方法向其中添加數據。 將數據添加到模擬列表是沒有意義的。 您可以使用 Mockito.when 在應該返回它的時候返回它,但是您會遇到麻煩,因為您可能需要存根更多方法並且很難知道哪些方法(isEmpty,size,...)。 您將數據對象添加到列表可能意味着正在測試的方法不僅傳遞列表,而且將訪問其中的數據。 在這種情況下,不要模擬列表,而是模擬您放入其中的數據對象。

暫無
暫無

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

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