java - Mockito .thenReturn(list.add()) 实际上向我的列表中添加了一些内容

标签 java list mocking mockito

我正在尝试测试我的一个函数,如果条件成立,它会向数据库添加一些内容。 现在在我的测试类中,我试图在列表中模拟它:

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

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

所以如果我的条件成立,这个断言应该是正确的:

AssertTrue(list.contains(Object)).

如果我的条件为假,则该断言应适用:

AssertFalse(list.contains(Object));

所以我的问题是,我的列表始终包含该对象,因为 .thenReturn 似乎被调用,即使它实际上没有被调用。

有没有办法阻止 list.add() 被调用?

最佳答案

这一行:

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

... 在您的测试中调用,无论xxx.addToDatabase()是否在测试代码中调用。 p>

因此,您将 myString 添加到测试用例中的 list 中。这解释了以下内容:

my list always contains the Object

回复:

Is there a way to prevent the list.add() being called?

我认为这里可能对如何使用模拟存在一些误解。

以下行...

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

... 表示:当调用 xxx.addToDatabase() 时,则返回 true,因为 list.add() 返回 boolean 值。我怀疑您想要发生的事情是执行 list.add 作为 xxx.addToDatabase()副作用。如果是这样,那么您可能需要使用 doAnswer 而不是 doReturn。如果您使用 MCVE 更新您的问题它将更容易指导您。

关于java - Mockito .thenReturn(list.add()) 实际上向我的列表中添加了一些内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48203968/

相关文章:

java - 如何从 javascript 调用 java 函数?

java - 在 Java 的最终类中声明 final方法的目的是什么

android - 阻止应用程序显示在 android kitkat 4.4.2 上的最近应用程序列表中

java - Mockito - 仅模拟一个方法

c# - 我是否正确编写了单元测试? NUnit + NSubstitute

java - 组合多个正则表达式从 : separated string 中提取子字符串

java - 错误: asking to create a new class while accessing innerclass

python - 如何计算元组列表中的重复项数?

java - 基于列表的 if 语句不起作用 - Java

unit-testing - 有哪些可用于 D 的模拟对象库?