我正在尝试测试我的一个函数,如果条件为真,它会向数据库添加一些东西。 现在在我的测试类中,我试图在列表中模拟它:
List list = new ArrayList();
String myString = "";
when(xxx.addToDatabase()).thenReturn(list.add(myString));
因此,如果我的条件为真,那么这个断言应该是正确的:
AssertTrue(list.contains(Object)).
如果我的条件是假的,那么这个断言应该适用:
AssertFalse(list.contains(Object));
所以我的问题是,我的列表总是包含Object,因为.thenReturn
似乎被调用,即使它实际上没有被调用。
有没有办法阻止调用list.add()
?
答案 0 :(得分:1)
这一行:
when(xxx.addToDatabase()).thenReturn(list.add(myString));
...在 test 中调用,无论是否在测试代码中调用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更新问题,则可以更轻松地为您提供指导。
答案 1 :(得分:0)
这就是你应该做的。
List<> someList = new ArrayList();
doAnswer(invocation -> {
someList.add(myString);
// return something
}).when(xxx).addToDatabase();