[英]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.