Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用对象创建模拟列表_Java_Junit_Mocking_Mockito_Junit5 - Fatal编程技术网

Java 使用对象创建模拟列表

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>();

我想用模拟对象创建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
的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>();