繁体   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