Java 使用对象创建模拟列表
我想用模拟对象创建JUnit测试:Java 使用对象创建模拟列表,java,junit,mocking,mockito,junit5,Java,Junit,Mocking,Mockito,Junit5,我想用模拟对象创建JUnit测试: public class BinCountryCheckFilterImplTest { private RiskFilterService riskFilterService = null; @Before public void beforeEachTest() { List<RiskFilters> list = new ArrayList<RiskFilters>();
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
的NPE。似乎在@BeforeClass之前调用了带有注释@test的方法。您提供的信息非常少。但是让我接过去
您必须具有BinCountryCheckFilter
类。请在测试类中初始化它,并添加注释@InjectMocks
@InjectMock
private BinCountryCheckFilter binCountryCheckFilter;
取riskFilterService=Mockito.mock(riskFilterService.class)
从@BeforeClass
中删除,并将其公开
但这只会嘲笑你的类,不会测试任何东西。您可以测试的一件事是没有呼叫。见下文
verify(mockList, times(1)).yourMethodName();
或者在测试或测试前方法中添加以下内容
when(riskFilterService.yurMethodName).thenReturn(your Return value);
这样,您就可以模拟所需的数据。
如果需要任何其他澄清,请告诉我
我不确定您的JUnit版本,但您可以删除
立即从您的代码中删除@BeforeClass
@Mock
List<RiskFilters> mockList = new ArrayList<RiskFilters>();
@Mock
List mockList=new ArrayList();
同样。当单元测试需要一个列表或任何其他集合时,首先要问自己的问题是:我应该为它创建一个模拟,还是应该创建一个包含模拟的列表或集合 当被测试的逻辑不使用列表,而只是传递列表时,您可以模拟它 否则,通常最好不要模拟列表或集合,而是创建一个包含模拟对象的普通列表或集合,因为很难知道列表或集合的哪些方法需要存根。当使用for循环迭代项时,当对它们使用迭代器时,当对它们使用流时,…,调用哪些方法?在编写单元测试时,我经常使用Collections.singletonList或Arrays.asList以及模拟参数来初始化列表
我看到您模拟了列表,然后在设置测试时调用add方法向其中添加数据。向模拟列表中添加数据是没有意义的。您可以使用Mockito.when在应该返回它的时候返回它,但是这样您就会遇到麻烦,因为您可能需要存根更多的方法,并且很难知道哪些方法(isEmpty、size,…)。您正在向列表中添加一个dataobject,这可能意味着被测试的方法不仅要传递列表,还要访问其中的数据。在这种情况下,不要模拟列表,而是模拟放入其中的数据对象。
RiskFilterService
是您要测试的类吗?你想模拟什么方法?是的,我不想模拟findRiskFiltersByTerminalIdAndType
的结果,比如:Mockito.when(riskFilterService.findRiskFiltersByTerminalIdAndType(anyInt(),anyString())。然后返回(new ArrayList());
我得到然后返回的方法(arrarylist)类型列表中未定义的
是否可以发布要测试的方法?以及使用哪种jUnit版本?
@Mock
List<RiskFilters> mockList = new ArrayList<RiskFilters>();