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,它现在似乎可以工作了。非常感谢你!“我对莫基托很陌生,所以问问题的能力也很差。”。。。不要对自己太苛刻:)除了没有格式之外,我觉得这个问题还行。再次感谢你的帮助和好话