Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.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 thenReturn(list.add())实际上在我的列表中添加了一些内容_Java_List_Mocking_Mockito - Fatal编程技术网

Java thenReturn(list.add())实际上在我的列表中添加了一些内容

Java thenReturn(list.add())实际上在我的列表中添加了一些内容,java,list,mocking,mockito,Java,List,Mocking,Mockito,我正在尝试测试我的一个函数,如果条件为真,它会向数据库中添加一些内容。 现在,在我的测试课上,我试图在一个列表上模拟这一点: List list = new ArrayList(); String myString = ""; when(xxx.addToDatabase()).thenReturn(list.add(myString)); 因此,如果我的条件为真,那么这个断言应该是正确的: AssertTrue(list.contains(Object)). 如果我的条件为假,则此断言

我正在尝试测试我的一个函数,如果条件为真,它会向数据库中添加一些内容。 现在,在我的测试课上,我试图在一个列表上模拟这一点:

List list = new ArrayList();
String myString  = "";

when(xxx.addToDatabase()).thenReturn(list.add(myString));
因此,如果我的条件为真,那么这个断言应该是正确的:

AssertTrue(list.contains(Object)).
如果我的条件为假,则此断言应适用:

AssertFalse(list.contains(Object));
所以我的问题是,我的列表总是包含对象,因为
.thenReturn
似乎被调用,即使它实际上没有被调用

有没有办法防止调用
列表.add()

when(xxx.addToDatabase()).thenReturn(list.add(myString));
。。。无论在测试代码中是否调用了
xxx.addToDatabase()
,都会在测试中调用

因此,您正在测试用例中将
myString
添加到
list
。这说明了以下几点:

我的列表始终包含对象

关于这一点:

是否有方法防止调用list.add()

我想这里可能有一些关于如何使用模拟的误解

下面一行

when(xxx.addToDatabase()).thenReturn(list.add(myString));

。。。意思是:当调用
xxx.addToDatabase()
时,返回
true
,因为
list.add()
返回布尔值。我怀疑您想要执行的是执行
list.add
,作为
xxx.addToDatabase()
的副作用。如果是这样,那么您可能希望使用
doAnswer
而不是
doReturn
。如果你用一个新的答案来更新你的问题,它将更容易指导你。

这就是你应该做的

List<> someList = new ArrayList();
doAnswer(invocation -> {
    someList.add(myString);
     // return something
    }).when(xxx).addToDatabase();
List-someList=new-ArrayList();
doAnswer(调用->{
添加(myString);
//归还某物
}).when(xxx).addToDatabase();

ye,但我如何防止这种情况发生,并将实际呼叫转发到我的列表中。add()?@Asiemie查看更新的答案。如果您可以添加您的测试用例(或者至少添加一个清晰复制您的问题的精简版本),那么为您提供问题第二部分的答案应该相当简单。谢谢您的帮助。我对莫基托很陌生,所以问问题的能力也很差。使用.doAnswer,它现在似乎可以工作了。非常感谢你!“我对莫基托很陌生,所以问问题的能力也很差。”。。。不要对自己太苛刻:)除了没有格式之外,我觉得这个问题还行。再次感谢你的帮助和好话