我正在尝试测试我的一个函数,如果条件为真,它会向数据库添加一些东西。现在在我的测试课上,我试图在列表中模拟它:
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()
。
因此,您将myString
添加到测试用例中的list
。这解释了以下内容:
我的列表始终包含对象
再说:
有没有办法防止 list.add(( 被调用?
我认为这里可能对如何使用模拟存在一些误解。
以下行...
when(xxx.addToDatabase()).thenReturn(list.add(myString));
。表示:当调用xxx.addToDatabase()
时,返回true
,因为list.add()
返回布尔值。我怀疑你想要发生的是执行list.add
作为xxx.addToDatabase()
的副作用。如果是这样,那么您可能需要使用 doAnswer
而不是 doReturn
.如果您使用 MCVE 更新您的问题,它将更容易指导您。
这是你应该做的。
List<> someList = new ArrayList();
doAnswer(invocation -> {
someList.add(myString);
// return something
}).when(xxx).addToDatabase();